Bash
sed 命令不能與 find -exec 一起使用?
我有這個文件:
文件.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/' '{}' \+
正則表達式是相同的,所以這不是問題,那是什麼?
在頂部,您引用了一個文件名
file.txt
,但隨後只處理該名稱的文件config.yml
,所以我假設它config.yml
包含這些模式。和標籤
locate
有點誤導,因為這與這兩者無關:)更重要的是,這是一個什麼樣的環境?在 Linux 系統上,通常安裝GNU/sed,並且需要選擇了解情況。括號表達式(你的模式的一部分)即使沒有.bash
-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/