3

bash-hackers wikiの推奨に従って、edを使用してファイルを編集したいと思います。

特に、sedの代わりにedを使用して次のことを実行したいと思います。

find . -type f -exec sed -i -e 's/a/b/g' {} \;

edにはsedの-eのようなオプションがないことがわかります。私の知る限り、パイプとioリダイレクトが非対話的に機能する唯一の方法です。

したがって、bashスクリプトからedを使用して、上記のsedコマンドと同じことを行うと、次のようになります。

ed file_name <<<$'g/a/s//b/g\nw'

または

echo $'g/a/s//b/g\nw' | ed file_name

しかし、私が知る限り、findの-exec内にパイプまたはioリダイレクトを含めることは不可能です。

私は何かが恋しいですか?または、これを克服する唯一の方法はループを使用することですか?

for file in $(find . -type f -print); do ed $file <<<$'g/a/s//b/g\nw'; done;
4

3 に答える 3

4
find . -type f -exec bash -c 'ed -s "$2" <<< "$1"' _ $'g/a/s//b/g\nw' {} \;

そしてPOSIXバージョン:

find . -type f -exec sh -c 'printf "%s\n" "g/a/s//b/g" w | ed -s "$1"' _ {} \;

ed over sed -iを使用する主な理由は、edがファイルを編集し、sed -iがファイルを上書きすることです。これは、壊れたくないリンクがある場合に問題になります。

于 2010-05-10T23:55:12.360 に答える
1

このfind&edスニペットは、テストモードを備えています(したがって、実際の一括置換操作の直前に正規表現を取得したことを確認できます)。

検索してfind&edに置き換えます

http://codesnippets.joyent.com/posts/show/2299

于 2010-05-11T07:10:16.907 に答える
0

すべてのリダイレクトと「ヒアドキュメント」を含むedコマンドをシェルスクリプトに入れ、findから呼び出します。

しかし、私は尋ねなければなりません:なぜエド?sedではできないことをedでできると思いますか?

于 2010-05-10T23:39:09.533 に答える