regex - 如何使用查找结果逐个文件执行 sed?

标签 regex linux sed find

我需要通过搜索模式来对文件执行替换,替换是通过执行另一个命令来获得的,该命令提供了要用作替换的字符串。然而,这也需要在目录中的每个文件上完成。以下语法无效,因为 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/

相关文章:

java - 将 XML 输入从多行转换为一行

linux - SED 删除带有扩展名的单词

linux - 如果第一行与模式匹配,sed 在文件的第一行插入字符串

php - & 登录 url 重写

java - Java 应用 Docker 化时串口访问失败

linux - 了解 bash 脚本语法

.net - 我如何连接到 .NET 中的远程 mysql 服务器?

c++ - 正则表达式匹配产生意外结果

php - "vertical"正则表达式匹配 ASCII "image"

python - Python 是否有正则表达式的最大组引用(如 Perl)?