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

ご存知のとおり、sedは、文字列の検索と置換に非常に効率的です。たとえば、「a」を検索します。 sed "s/a/b/g"に置き換えます。

sed

これは、sedコマンドがないTV用のトリミングされたLinuxシステム用です。したがって、sed "s/a/b/g". –

コメント

  • の代わりに、他のコマンドまたはスクリプトを使用する必要があります。正規表現ベースの置換。このようなことを処理できるツールや言語ならどれでも同じことができますが、構文はさまざまです:$var=~s/a/b/ggsub(/a/,"b",var)var.gsub(/a/,'b')var.replace(/a/g,'b')preg_replace("/a/","b",$var)regsub -all a b $var。それに加えて、多くのツールや言語でもプレーンテキストの文字列置換を行うことができます。だからあなたの質問はどういうわけか広いです。
  • なぜですか?どのような問題を解決しようとしていますか?
  • テレビ用にトリミングされたLinuxシステムは、コマンドをsedしていません。そのため、sed ' s / a / b / g 'の代わりに他のコマンドまたはスクリプトを使用する必要があります。

回答

はい、これを行うにはさまざまな方法があります。 awkperl、または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は、sedsedよりも優れています。 >(perlまたはawkは言うまでもなく)1文字の置換は、スレッジハンマーを使用してハエを殺すようなものです。

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

または、一部のシェルの置換機能を使用することもできます。ここでは、kshzsh、または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の哲学はそれが何であるかです。)

回答

祖先の使用コマンド(-sは静か(サイレント)を意味し、コマンドの前のコンマはすべての行で実行することを意味します):

印刷するだけ STDOUT の場合:

ed -s file <<! ,s/a/b/g ,p q ! 

インプレースの置き換え:

ed -s file <<! ,s/a/b/g w q ! 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です