2016-08-16 10 views
1

ファイルから行をgrepしようとしていますが、$ 1から文字を変更しようとしています。 たとえばgrepとgreppedの結果から文字を置き換えます。

cat file1.txt 
Surjit 
Shilpa 
cchiku 
end of file 

私は、sで始まる行を試してみました。

grep -e "S" 

は、その後、私はFILE1.TXT

内のすべてのgrepped結果をxに4番目の文字を置換したい私は、私だけgrepped結果のためにこれを行うことができますどのように

sed -i "s/./x/4" file1.txt 

を試してみましたか?

答えて

3

あなたはsed '/pattern/s/find/replace/' file構文を使用することができます:あなたのファイルで

sed '/^S/s/./x/4' file 
#  ^^ ^^^^^^^ 
#  | replace the 4th character with x 
#  | 
#  on lines starting with S 

を:ちょうどあなたの場合ので、私は、Sとを開始する行にマッチするパターンとして/^S/を使用しています

$ sed '/^S/s/./x/4' file 
Surxit 
Shixpa 
cchiku 
end of file 

注意を/S/とすると、には Sが含まれています。アンカー^は、行の先頭を示します。コマンドは、Sで始まる行と一致すると、一致するグループにS、次の2つの文字を入れ

sed 's/^\(S..\)./\1x/' file 

+0

これは機能します。私がパターンを使用していて、ラインから$ 1をグロッピングしていれば、それはうまくいくでしょうか? grep -e "regxp"を使用できません。何かを – Raj

+0

@Rajもちろん、 'sed" /$1/s/./x/4 "file'と言うか、var' var = $ 1'と 'sed '/$var/s/./に入れてください。 x/4 "file' – fedorqui

+1

もちろん、' sed -n -e '/^S/s /./x/4p''などの行を印刷するだけで、 'grep'の不要な使用を避けることができます最初のパターンと一致した。 – ghoti

2

fedorqui's answerの代替は、パターン自体にS条件で始まる含めることです。置換部分では、一致するグループの内容が再利用され、次の文字はxに置き換えられます。

+0

いいね!私は好奇心が強く、内部的には何が良いですか:別々に検索を行い、その後の置換(私が行ったように)または一致した部分で一致させることができます。 – fedorqui

+0

私はそれが入力データに依存していると思いますが、簡単に試してみましょう! :) ....分... – hek2mgl

+1

@fedorqui私はちょうど短いテストをしました:上記の入力ファイルは2億本のファイルがあるまでそれ自身でcatします。あなたの解決は1分59秒かかりました。私は1分17分かかりました。実際それは理にかなっています。 – hek2mgl

2
awk -v FS="" -v OFS="" '/^S/{$4="x"}1' infile 
Surxit 
Shixpa 
cchiku 
end of file 
関連する問題