![sed 命令不能与 find -exec 一起使用吗?](https://linux22.com/image/173425/sed%20%E5%91%BD%E4%BB%A4%E4%B8%8D%E8%83%BD%E4%B8%8E%20find%20-exec%20%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8%E5%90%97%EF%BC%9F.png)
我有这个文件:
文件.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
在顶部,您引用了一个文件 name file.txt
,但随后只处理该 name 的文件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/