Bash

sed 命令不能與 find -exec 一起使用?

  • May 18, 2020

我有這個文件:

文件.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

它將更改23

...
   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/

引用自:https://unix.stackexchange.com/questions/587308