Sedコマンドを使わずに文字列を見つけて置き換える方法は?

Sedコマンドを使わずに文字列を見つけて置き換える方法は?

私たち全員が知っているように、sed文字列を見つけて置き換えるのは非常に効率的です。たとえば、「a」を見つけて「b」に置き換えますsed 's/a/b/g'

代わりに他のコマンドやシェルスクリプトを使用できますかsed

このコマンドがないテレビ用Linuxの切り捨てバージョンですsed。したがって、代わりに別のコマンドまたはスクリプトを使用する必要があります。sed 's/a/b/g'. –

答え1

単一文字置換の古典的な選択肢は次のとおりです。trこのコマンドは、ほぼすべてのシステムで使用できます。

$ echo "foobar" | tr a b   
foobbr

trsedsedまたはもちろん)を使用して単一の文字置換を実行することは、大きなハンマーでハエを殺すのと同じであるため、実際にはそれよりも優れています。perlawk

grepこの目的のために設計されておらず、入力を変更せずに検索するだけです。

または、次のものを使用できます。代替能力いくつかのシェル。ここではor構文が使用されますkshzshbash

$ foo="foobar"
$ echo "${foo//a/b}"
foobbr

解決しようとしている問題が何であるかを正確に説明すると、より具体的な回答を提供できます。

答え2

はい、これを行う方法はいくつかあります。awkperlまたはを使用してこれらのアクティビティを実行することもできます。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
!

関連情報