ご存じのように、sed
は文字列を検索して置き換えるのに非常に効率的です。たとえば、「a」を見つけて「b」に置き換えます:sed 's/a/b/g'
。
sed
の代わりに他のコマンドまたはシェルスクリプトでこれを行うことは可能ですか?
これは、sed
コマンドを持たないTV用のトリミングされたLinuxシステム用です。したがって、sed 's/a/b/g'. –
の代わりに他のコマンドまたはスクリプトを使用する必要があります
はい、これを行うにはさまざまな方法があります。 awk
、Perl
、またはbash
を使用して、これらのアクティビティを行うこともできます。一般的にはsed
はおそらく、これらのタイプのタスクを実行するための最も適切なツールです。
ファイルdata.txt
にこのサンプルデータがあるとします。
foo bar 12,300.50
foo bar 2,300.50
abc xyz 1,22,300.50
awk
$ awk '{gsub("foo", "foofoofoo", $0); print}' data.txt
foofoofoo bar 12,300.50
foofoofoo bar 2,300.50
abc xyz 1,22,300.50
Perl
$ Perl -pe "s/foo/foofoofoo/g" data.txt
foofoofoo bar 12,300.50
foofoofoo bar 2,300.50
abc xyz 1,22,300.50
上記の例では、ファイルを直接変更することもできます。 Perlの例は簡単です。 -i
スイッチを追加するだけです。
$ Perl -pie "s/foo/foofoofoo/g" data.txt
awk
の場合、少し直接的ではありませんが、効果は同じです。
$ { rm data.txt && awk '{gsub("foo", "foofoofoo", $0); print}' > data.txt; } < data.txt
このメソッドは、ブレース '{...} `を使用してサブシェルを作成します。
$ { ... } < data.txt
ファイルがサブシェルにリダイレクトされると、そのファイルは削除され、サブシェルSTDINに読み込まれたファイルのコンテンツに対してawk
が実行されます。次に、このコンテンツはawk
によって処理され、削除したばかりの同じファイル名に書き戻され、効果的に置き換えられます。
単一文字置換の古典的な代替手段は tr
コマンドであり、ほぼすべてのシステムで使用できるはずです。
$ echo "foobar" | tr a b
foobbr
tr
は、sed
(sed
またはPerl
はもちろん)を1文字の置換に使用することは、スレッジハンマーを使用してフライを殺すことに似ているため、実際にはawk
よりも優れています。
grep
はこのために設計されておらず、入力を変更せず、検索するだけです。
または、一部のシェルの substitution capabilities を使用できます。ここでは、ksh
、zsh
、またはbash
構文を使用しています。
$ foo="foobar"
$ echo "${foo//a/b}"
foobbr
解決しようとしている問題を正確に説明すると、より具体的な回答が得られます。
VimはExモードで使用できます。
ex -s -c '%s/a/b/g|x' file
%
すべての行を選択
s
代替
g
グローバル置換
x
保存して閉じる
ストリームではなくファイルを使用している場合は、標準のテキストエディタed
を使用できます。
printf '%s\n' ',s/a/b/g' w q | ed file.txt
これはどの* nixでも利用できるはずです。 ',s/a/b/g'
内のコンマは、ed
がevery行で機能するように指示します(%
を使用することもできます。 )、そして残りは標準的な検索と置換です。 w
はファイルに書き込む(保存する)ように指示し、q
は終了するように指示します。
Sedの-i
オプション(および他のツールの同様のオプション)とは異なり、これは実際には一時ファイルでチートするのではなく、ファイルをインプレースで編集することに注意してください。
これをストリームで動作させることは可能ではないと思いますが、ed
についてはあまり詳しくありません。実際にその機能があるとしても、驚くことはありません(UNIXの哲学はです)。
先祖 ed コマンドの使用(ここで-s
はクワイエット(サイレント)を意味し、コマンドの前のコンマはすべての行で実行されることを意味します):
[〜#〜] stdout [〜#〜]に印刷するだけ:
ed -s file <<!
,s/a/b/g
,p
q
!
インプレース置換:
ed -s file <<!
,s/a/b/g
w
q
!