
私たち全員が知っているように、sed
文字列を見つけて置き換えるのは非常に効率的です。たとえば、「a」を見つけて「b」に置き換えますsed 's/a/b/g'
。
代わりに他のコマンドやシェルスクリプトを使用できますかsed
?
このコマンドがないテレビ用Linuxの切り捨てバージョンですsed
。したがって、代わりに別のコマンドまたはスクリプトを使用する必要があります。sed 's/a/b/g'. –
答え1
単一文字置換の古典的な選択肢は次のとおりです。tr
このコマンドは、ほぼすべてのシステムで使用できます。
$ echo "foobar" | tr a b
foobbr
tr
sed
(sed
またはもちろん)を使用して単一の文字置換を実行することは、大きなハンマーでハエを殺すのと同じであるため、実際にはそれよりも優れています。perl
awk
grep
この目的のために設計されておらず、入力を変更せずに検索するだけです。
または、次のものを使用できます。代替能力いくつかのシェル。ここではor構文が使用されますksh
。zsh
bash
$ foo="foobar"
$ echo "${foo//a/b}"
foobbr
解決しようとしている問題が何であるかを正確に説明すると、より具体的な回答を提供できます。
答え2
はい、これを行う方法はいくつかあります。awk
、perl
またはを使用してこれらのアクティビティを実行することもできます。bash
一般的に言えば、sed
これらのタスクを実行するのに最適なツールです。
はい
ファイルに次のサンプルデータがあるとしますdata.txt
。
foo bar 12,300.50
foo bar 2,300.50
abc xyz 1,22,300.50
アッ
$ 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 -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
ファイルがサブシェルにリダイレクトされると、そのファイルは削除され、サブシェルawk
のSTDINに読み込まれたファイルの内容に対して実行されます。これにより、そのコンテンツが処理され、削除したばかりのawk
同じファイル名に書き戻され、効果的に置き換えられます。
答え3
POSIXツールを使用できますex
。
ex a.txt <<eof
%s/Sunday/Monday/g
xit
eof
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
答え4
先祖の使用編集するコマンド(ここでは-s
静か(自動)を意味し、コマンドの前のコンマはすべての行で実行されることを意味します):
印刷したばかり標準出力:
ed -s file <<!
,s/a/b/g
,p
q
!
内部交換:
ed -s file <<!
,s/a/b/g
w
q
!