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

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

它将更改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/' '{}' \+

正则表达式是相同的,所以这不是问题,那是什么?

答案1

在顶部,您引用了一个文件 name file.txt,但随后只处理该 name 的文件config.yml,所以我假设它config.yml包含这些模式。

locatebash 标签有点误导,因为这与两者无关:)更重要的是,这是什么样的环境?在 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/

相关内容