私はこのファイルを持っています:
ファイル.txt:
...
threshold:
swipe: 2
pinch: 2
interval:
swipe: 2
pinch: 2
いいえ、そうすれば:
$ locate config.yml | while read i; do sed '/swipe|pinch/s/[0-9]/3/' $i; done
2
次のように変更されます3
。
...
threshold:
swipe: 3
pinch: 3
interval:
swipe: 3
pinch: 3
しかし、次はfind
そうではありません。
sudo find / -name config.yml -exec sed -n '/swipe|pinch/s/[0-9]/3/' '{}' \+
正規表現は同じなので問題ありません。何が問題ですか?
答え1
上部でファイル名を参照しますfile.txt
が、その名前のファイルのみが処理されるため、これらのパターンが含まれているとしますconfig.yml
。config.yml
locate
そしてbash
商標これはどちらかとは関係がないので、少し誤解を招く可能性があります。)もっと重要なのは、これがどのような環境ですか? LinuxシステムではGNU/sed通常はインストールされ、-E
オプションが必要です。理解する状態swipe|pinch
。それなしで角括弧式([0-9]
パターンの一部)は機能します-E
。
したがって、これを念頭に置いて、次はGNU / sedとBSD/sed:
locate config.yml | while read -r i; do sed -E '/swipe|pinch/s/[0-9]/3/' "$i"; done
または以下を使用してfind
:
find . -name config.yml -exec sed -E '/swipe|pinch/s/[0-9]/3/' '{}' +
注:パターンは/swipe|pinch/
正しいです。パイプシンボルをエスケープするように変更する提案は、もはや/swipe\|pinch/
正規表現ではなく、リテラルと一致するため、|
ファイル内のどの項目とも一致しないため、機能しません。しかしそれは会議周辺アポストロフィ('
)を省略すると動作します。
sed -E /swipe\|pinch/s/[0-9]/3/