ご存知のように、sed文字列の検索と置換は非常に効率的です。たとえば、「a」を見つけて「b」に置き換えますsed 's/a/b/g'。
代わりに他のコマンドまたはシェルスクリプトでこれを行うことは可能sedですか?
これは、sedコマンドを持たない、TV用のトリミングされたLinuxシステム用です。そのため、代わりに他のコマンドまたはスクリプトを使用する必要がありますsed 's/a/b/g'. –
ご存知のように、sed文字列の検索と置換は非常に効率的です。たとえば、「a」を見つけて「b」に置き換えますsed 's/a/b/g'。
代わりに他のコマンドまたはシェルスクリプトでこれを行うことは可能sedですか?
これは、sedコマンドを持たない、TV用のトリミングされたLinuxシステム用です。そのため、代わりに他のコマンドまたはスクリプトを使用する必要がありますsed 's/a/b/g'. –
回答:
はい、これを行うにはさまざまな方法があります。、、またはを使用してawk、これらのアクティビティを実行することもできます。ただし一般的には、これらのタイプのタスクを実行するのにおそらく最も適切なツールです。perlbashsed
ファイルにこのサンプルデータがあるとします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
ファイルがサブシェルにリダイレクトされると、ファイルは削除され、awkサブシェルSTDINに読み込まれたファイルの内容に対して実行されます。その後、このコンテンツは処理さawkれ、削除したのと同じファイル名に書き戻されて、事実上置き換えられます。
sedいないI. sedのは、このような置換を行うための適切なツールである、と彼は明らかに、より良いので、これらの事は悪いものの、誰かを示し、これらのツールの役割を理解するために求めていますが、非常に示すの教育ですそれらの理由。あまりにも多くの人が知っている人は、理由を説明せずに単に「やらない」と言うので、私はそうです。しかし、少なくともDVの理由についてコメントを残してくれてありがとう。
単一文字置換の古典的な代替は、trほぼすべてのシステムで使用できるコマンドです。
$ echo "foobar" | tr a b
foobbr
trsedこれは、実際にこれよりも優れています。1文字の置換にsed(単独perlまたはawk)を使用することは、スレッジハンマーを使用してハエを殺すようなものです。
grep このために設計されておらず、入力を変更せず、検索のみを行います。
または、一部のシェルの置換機能を使用できます。ここでksh、zshまたはbash構文を使用します:
$ foo="foobar"
$ echo "${foo//a/b}"
foobbr
解決しようとしている問題を正確に説明すると、より具体的な回答が得られます。
${foo//a/b}ないオプションはありますか?
echo "$foo" | sed 's/a/b/i、文字クラスを指定する必要がありますecho ${foo//[aA]/b}。
ExモードでVimを使用できます:
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します(vimに慣れている場合は、これもおなじみです)を使用し、残りは標準の検索および置換です。ファイルを書き込む(保存する)ように指示し、終了するように指示します。%wq
sedの-iオプション(および他のツールの同様のオプション)とは異なり、これは一時ファイルをごまかすのではなく、実際にファイルをその場で編集することに注意してください。
これをストリームで動作させることは不可能だと思いますが、それから私はあまり多くのことedを知りませんし、実際にその機能を持っているとしても驚きません(unixの哲学はそれです)。
$var=~s/a/b/g、gsub(/a/,"b",var)、var.gsub(/a/,'b')、var.replace(/a/g,'b')、preg_replace("/a/","b",$var)、regsub -all a b $var。それに加えて、多くのツールと言語はプレーンテキスト文字列の置換を行うこともできます。あなたの質問はなんとなく広範です。