让我将我的问题分解成最简单的例子。
创建一个包含一行文本的测试文件。
[root@myserver ] /tmp> echo "test ReplaceMe DoNotReplaceMe" > /tmp/daj.txt
我们有一个现有的
find
命令,用于在所有匹配的文件中替换文本(在这个例子中,我简化了这个命令,只在一个文件上工作,并剥离了它所做的其他事情)。问题是它会在出现"ReplaceMe"的任何地方进行替换,而不仅仅是它单独成词时才替换。
[root@myserver ] /tmp> find /tmp/daj.txt -exec sh -c 'f="{}"; sed -e 's/ReplaceMe/#DONE#/gi' "${f#.}" ' \;
test #DONE# DoNot#DONE#
我已经写了一个新的sed
命令,只有在"ReplaceMe"是单独的单词时才进行替换,而不是在它是另一个单词的子字符串时进行替换。这个命令的输出是正确的。
[root@myserver ] /tmp> cat /tmp/daj.txt | sed -e 's/\(\W\)\(ReplaceMe\)\(\W\)/\1#DONE#\3/gi'
test #DONE# DoNotReplaceMe
当我尝试将更新后的sed
命令与find
命令结合使用时,它就会出错。看起来我遇到了转义问题,但是我添加额外的转义并没有解决它。
[root@myserver ] /tmp> find /tmp/daj.txt -exec sh -c 'f="{}"; sed -e 's/\(\W\)\(ReplaceMe\)\(\W\)/\1#DONE#\3/gi' "${f#.}" ' \;
sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `f="/tmp/daj.txt"; sed -e s/(W)(ReplaceMe)(W)/1#DONE#3/gi "${f#.}" '
有没有办法在我的
sed
命令中使用转义字符,以便我可以通过find
运行它,或者我必须寻找替代解决方案?更新:我们正在运行的完整的
find
命令会输出文件名和权限,然后将sed
的输出导入到md5sum
。以下是它运行并匹配多个文件的示例:[root@myserver ] ~> find /tmp -regex '.*daj.*\.txt' -printf '%p %m ' -exec sh -c 'f="{}"; sed -e 's/ReplaceMe/#DONE#/gi' "${f#.}" | md5sum' \;
/tmp/daj2.txt 644 d52bbd311552234b761bcae694c2055a -
/tmp/daj.txt 644 d52bbd311552234b761bcae694c2055a -