ご存知のとおり、sed
は、文字列の検索と置換に非常に効率的です。たとえば、「a」を検索します。 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
によって処理され、同じファイル名に書き戻されます。削除したばかりで、事実上置き換えられています。
コメント
- 回答ありがとうございます。翌営業日に試してみますが、 ' sed 'など、一部のコマンドがTVのトリミングされたLinuxシステムに存在しない可能性があるため、機能します。それでも使用したいコマンド' find '、' grep 'などで解決します。
- @ binghenzq- 'ファイルをインライン編集する例を追加しました。
- -1私はめったに反対票を投じませんが、この場合は質問は、他のより複雑で、おそらく依存しているというよりも、より単純な方法であるように思われました。質問が* nixマシンの完全インストールの代替案に関するものであれば、おそらくこの他の点では良い答えを+1するでしょう。
- @ MichaelDurrant-OPが要求したb / cの精巧なインライン編集を追加しました。 。また、OPは、Iではなく
sed
を使用して NOT の要件を設定しました。Sedはこのような置換を行うための適切なツールであり、'は明らかにこれらのツールの役割をよりよく理解することを求めているので、誰かにこれらのことを悪いとはいえ見せることは、その理由を示す上で非常に教育的です。知っている人の多くは、単に" don ' t do it "と言うだけです。理由を説明せずに、私はそうです。しかし、少なくともあなたがDVをする理由についてコメントを残してくれてありがとう。 - 確かに、それは他のすべての点で素晴らしい答えだと思いました。ええ、説明なしで-1が嫌いです。
回答
1文字の置換の古典的な代替手段は tr
コマンド。ほぼすべてのシステムで使用できます:
$ echo "foobar" | tr a b foobbr
tr
は、sed
divを使用しているため、実際にはsed
よりも優れています。 >(perl
またはawk
は言うまでもなく)1文字の置換は、スレッジハンマーを使用してハエを殺すようなものです。
grep
はこのために設計されておらず、入力を変更せず、検索するだけです。
または、一部のシェルの置換機能を使用することもできます。ここでは、ksh
、zsh
、またはbash
構文を使用しています:
$ foo="foobar" $ echo "${foo//a/b}" foobbr
解決しようとしている問題を正確に説明していただければ、より具体的な回答を提供できます。
コメント
-
${foo//a/b}
のケースを無視するオプションはありますか? - @ AlikElzin-kilaka I '恐れ入りますそうではありません。 'たとえば、
echo "$foo" | sed 's/a/b/i
のようなより洗練されたものを使用するか、文字クラスをecho ${foo//[aA]/b}
。
回答
POSIXツール:
ex a.txt <<eof %s/Sunday/Monday/g xit eof
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
コメント
- ありがとうございます。追加するだけで、-cフラグは編集の開始時にコマンドを実行することであり(exはエディターであるため)、-sフラグはフィードバックを無効にするスクリプトモードであるか、slient-modeと言います。詳細については、 ex-vi.sourceforge.net/ex.html
回答
ストリームではなくファイルを使用している場合は、標準のテキストエディタed
を使用できます:
printf "%s\n" ",s/a/b/g" w q | ed file.txt
これはすべての* nixで使用できます。",s/a/b/g"
のコンマはed
は、すべての行で作業し(%
を使用することもできます。これは、vimに慣れている場合はより馴染みがあります)。そのうちの標準的な検索と置換です。 w
はファイルを書き込む(保存する)ように指示し、q
は終了するように指示します。
とは異なり、 sed “s -i
オプション(および他のツールの同様のオプション)。これは、一時ファイルをだまし取るのではなく、実際にファイルをインプレースで編集します。
私はしませんこれをストリームで機能させることは可能だとは思わないが、ed
についてはあまりよく知らないので、実際にその機能があるとしても驚かないだろう。 (unixの哲学はそれが何であるかです。)
回答
祖先の使用 ed コマンド(-s
は静か(サイレント)を意味し、コマンドの前のコンマはすべての行で実行することを意味します):
印刷するだけ STDOUT の場合:
ed -s file <<! ,s/a/b/g ,p q !
インプレースの置き換え:
ed -s file <<! ,s/a/b/g w q !
$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
。それに加えて、多くのツールや言語でもプレーンテキストの文字列置換を行うことができます。だからあなたの質問はどういうわけか広いです。