我需要通过搜索模式来对文件执行替换,替换是通过执行另一个命令来获得的,该命令提供了要用作替换的字符串。然而,这也需要在目录中的每个文件上完成。以下语法无效,因为 sed 没有输入文件。
find . type f -exec sed -i "s/<pattern1>/$(sed -n 's/abcd\(pattern2\)efgh/\1/p')/g" {} \;
想法是内部 sed 返回 pattern2 供外部 sed 用作 pattern1 的替代品。但是我需要对目录中的每个文件执行此操作。我无法弄清楚语法。
如果我对内部 sed 使用 find,
find . type f -exec sed -i "s/<pattern1>/$(find . -type f -exec sed -n 's/abcd\(pattern2\)efgh/\1/p' {} \;)/g" {} \;
我以一个错误结束 sed:-e 表达式 #1,字符 53:未终止的“s”命令。
我能得到一些帮助吗?
最佳答案
如有疑问,请牺牲简洁性以提高可读性。这是一个临时脚本 ad-hoc.sh(在评论和聊天中讨论之后):
#!/bin/bash
file="$1"
patternInner=$(sed -n -r "s/.*class\s*(.*)\s*:\s*public.*/\1/p" "$file")
if [[ -n "$patternInner" ]]
then
echo -e "$patternInner matching in $file" >> findsed.log
# sed -i "s/void\s*\(test.*\)\s*()/MWTEST($patternInner, \1)/" "$file"
sed "s/void\s*\(test.*\)\s*()/MWTEST($patternInner, \1)/" "$file"
else
echo patternInner empty for file $file >&2
fi
修改:现实生活中的 sed 表达式。测试非空 patternInner。
如果找到模式,则进行某种日志记录,文件名,匹配的模式。
不要忘记 chmod a+x ad-hoc.sh
。
如果测试看起来有效,您必须激活带有 sed -i 的行而不是没有 -i 的行,以使更改不仅发生在屏幕上,而且发生在文件中。
用法:
for f in *.?pp # would work for a flat directory as well as find.
do
./ad-hoc.sh "$f"
done 2> forsed.err
或者使用 find,如果你坚持:
find . -type f -name "*.?pp" -exec ./ad-hoc.sh {} ";" 2> findsed.err
当然可以放在单引号里执行
... -exec bash -c '....(ad-hoc.sh
code
here)' {} ";"
但在这种情况下我更喜欢临时脚本。减少掩蔽的麻烦。更好的可编辑性,更好的可测试性。
根据 $patternInner 的可变性,必须考虑屏蔽,但我希望它可能只是字符和数字,没有美元、星号和反斜杠。
关于regex - 如何使用查找结果逐个文件执行 sed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48626353/