例えば
find ./ -name file_name -exec grep -B 2 "earth" {} \; -print | grep "moon"
というコマンドを実施し、出力が
planetkind moon
だったとします。
このfile_nameファイルの一部にある
『 planetkind moon』
という箇所を
『 planetkind taiyo』
に変更したいのですが、

find ./ -name file_name -exec grep -B 2 "earth" {} \; -print | grep "moon" | xargs sed -i "s/moon/taiyo/"
とすると、ファイル中の全てのmoonがtaiyoになってしましまいます。

このgrepでの抽出箇所のみ置換して元ファイルを上書きする方法は有りますか?

以上、宜しくお願いいたします。

A 回答 (3件)

> このgrepでの抽出箇所のみ置換して元ファイルを上書きする方法は有りますか?



ありそうですね。

grepで行番号を出力、sedで行番号も指定して置換など。

grep -B 2 "earth" | head -1
235-moon

grep -B 2 "earth" | head -1 | grep moon | sed s/-.*$//
235

sed -i 235s/moon/taiyo/

こんな感じの流れにできれば良いのでしょうけど。

質問に書かれているのはfindで一つのファイルからしか見つからない前提で良いのでしょうか。
違うとしたら、grepにファイル名も出力させて処理してやる必要がありそうに感じました。
    • good
    • 0

それは....


たぶん, パターンスペースをうまく使えばできると思う.

けど, sed じゃない何かを使うことを強く勧める.
    • good
    • 0

そりゃそうだ.


sed "s/moon/taiyo/"
って, 「moon を taiyo に置き換える」ってことでしょ?
「planetkind moon」を「planetkind taiyo」に変更するなら, そのように書かないと.

この回答への補足

言葉が足らずすみません。

質問はearthという文言が存在する行の2行上にある
planetkind moon を planetkind taiyoに変えたいのです。

他の行にもplanetkind moonという行は存在するのです。

補足日時:2011/04/13 14:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Qsedなどで、特定の文字列の後の文字列を抽出したい

sedなどで、特定の文字列の後の文字列を抽出したい

シェルスクリプト内で、sedなどを使って特定の文字列の後の文字列を抽出したいのですが、どうすればいいでしょうか?

たとえば、abcXYZ123defghiのなかから、XYZの後の「123」を抜き出したいです。

echo abcXYZ123defghi | sed ...

のようにして実行させたいです。

Aベストアンサー

日本語対応sedだと日本語数字混じりでもできますね。

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/' -e 'y/0123456789/0123456789/'
12357

※ 使っている日本語コードの指定は必要かも(例えば、 --ctype=EUC)

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/'
12357

※ 入力フォームに書いている時はASCIIと日本語の判別がし易いけど回答見るとわかり難いですね。後ろの例での結果57とy/0123456789/の数字部分が日本語です。

Qシェルスクリプトでファイル内の数値文字列を数値として扱うには

失礼します。
シェルスクリプトでファイル内のテキスト(数値文字列)を取得して、それを使って計算するにはどうすれば良いでしょうか?

str:ファイル内のテキスト(数値文字列)

res=$(( $str + 1 ))

・エラー
")syntax error: invalid arithmetic operator (error token is "


よろしくお願いします。

Aベストアンサー

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをexprに書き換えたところ
$ ./test2.sh
Using expr
09:19:00.302748000
09:19:19.259990000

exprだと19秒ですが、$(( 演算 )) だと10秒程度なので、演算が多くなれば確かにexprは不利ですね。

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをe...続きを読む

Q「指定文字列を含まない行」を指定する正規表現

正規表現で指定した文字列を"含まない"行を指定する方法はありますでしょうか。
例えば、

ABDDDDG
ABEEEEG
ABFFFFG
ABXXXXG
ABHHHHG

とある場合、「XXXX」を含まない行、という指定をして他の4行を指定したいのです。

Aベストアンサー

ANo1さんも仰られているとおり、御自身で開発されるのであればプログラム言語側の判別で振り分けたほうが良いと思います。
ただ其れとは別に特定ツールの機能内で何とかしたい等、「どうしても正規表現で」ということであればで一例を記載しますが・・・おすすめはしません。

# 基本形
# 空行(というか、改行のみ)だろうとマッチ
# 否定先読みによって、「弾きたい文字列の表われない行の行頭」にマッチさせています。
/^(?!.*XXXX)/
http://ideone.com/TFsXh

# 応用例
# 空行(というか、改行のみ)はマッチ除外
/^.(?!.*XXXX)/
http://ideone.com/XvywR

<おまけ>
否定戻り読みはPCRE系でも利用できない物が多く感じる為省きました。
最後に再掲しますが、この手法をお勧めはしません。

Qテキストファイルのn行目以下を出力する方法

catコマンドか他のコマンドを使って、テキストファイルのn行目以下を出力する方法はありますか?

Aベストアンサー

蛇足っぽいですが、sedによる別解です。
(3行目以降の場合)

>sed -ne '3,$p' input.txt

Qfindでフォルダだけを検索

find / -name "apache*"
これを、フォルダだけヒットするような文にするとどうなりますか?

Aベストアンサー

がると申します。

find / -name "apache*" -type d
でいかがでしょうか?

QLinux環境 grepで改行コード(CRLF、LF)を検索できないで

Linux環境 grepで改行コード(CRLF、LF)を検索できないでしょうか?
grep '\t\n' aaa.txtとしても、「\」はエスケープしてしまいます。
検索方法、grep以外でもご存知の方いらっしゃいましたらご教示いただけたら幸いです。

Aベストアンサー

GNU grep 2.5.4 だと、実験的なものだとかかれていますが
-P オプションで perl の正規表現が使えます。

それを使えば

grep -P '\r\n' aaa.txt
で CRLF を持つ行を抽出できます。

他の方が書かれているように CR は \t ではなく、
\r です。

Qbashなどのシェル変数の値に改行を含める事は可能でしょうか?

タイトルの通りですが、通常のシェル変数の値として

 [prompt]$ aaa="bbb<改行>ccc"

のようなセットを行い、

 [prompt]$ echo $aaa
 bbb
 ccc
 [prompt]$

のような結果を得たいのですが、可能でしょうか。

Aベストアンサー

可能です.
というか,やってみたら出来ることがわかると思います.こんなところで聞くより早い.
なお,sh/bash系では改行文字は特にエスケープせずそのまま入れられます.

aaa='bbb
ccc'

Qwgetでファイル名を指定してページを保存するには

wgetでページを保存したいのですが、ローカル側に保存するページ名を自分の好きな名前にしたいです。どうしたら良いでしょうか?

たとえば次のような感じです。
○リモートファイル名:「http:www.test.com/test_page.htm」
○ローカルファイル名:「hoge1.htm」

Aベストアンサー

-Oを付けて、
wget -O hoge1.htm http:www.test.com/test_page.htm

参考
http://www.google.co.jp/search?num=50&lr=lang_ja&ie=sjis&q=wget%20使い方

Q空白を含んだシェル変数の代入

こんにちは。
空白を含んだシェル変数の代入について教えてください。

set test1="ABCD EFGHIJ"
set w1=$test1
echo "w1 = $w1"

このようなシェルスクリプトを実行させた時
w1 = ABCD
と表示されてしまいます。
解決案があれば教えてください。

よろしくお願いします。

Aベストアンサー

set w1="$test1"

ダブルクォーテーションで囲ってください。
この場合シングルはダメです(変数内容が展開されません)。


人気Q&Aランキング

おすすめ情報