![如何注释文件夹中所有文件中与模式匹配的行](https://linux22.com/image/94209/%E5%A6%82%E4%BD%95%E6%B3%A8%E9%87%8A%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E4%B8%AD%E4%B8%8E%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D%E7%9A%84%E8%A1%8C.png)
在一个文件夹中我有很多文件。如果存在特定模式,我想注释每一行
示例模式:
`include "xyz.vh"
预期输出:
// `include "xyz.vh"
所以请给我同样的指导。
答案1
这可能对你有帮助,
sed '/`include "xyz.vh"/s/^/\/\/ /' filename
如果你想在所有文件中搜索模式,那么你可以使用这个命令,
find . -type f -exec sed '/`include "xyz.vh"/s/^/\/\/ /' {} \;
另一种方法是使用perl
,
perl -p0e 's/(.*`include "xyz.vh"\n)/\/\/ \1/g' file
答案2
用于grep
过滤包含所需模式的文件
grep -rlZ 'pattern'
-r
递归搜索目录(默认为当前目录)包括子目录的选项-l
仅列出与模式匹配的文件名-Z
由零字节分隔的输出(以处理包含换行符等异常字符的文件名),然后可以将其传递到类似sed
或perl
使用的程序xargs -0
来执行搜索和替换
把它们放在一起:
grep -rlZ '`include "xyz.vh"' | xargs -0 perl -i -pe 's|^|// | if /`include "xyz.vh"/'
-i
选项将修改输入文件本身的更改
答案3
和awk
:
awk '/`include "xyz.vh"/ {print "// " $0; next} 1' file.txt
要使用最新的 GNU 就地编辑文件awk
:
awk -i inplace '/`include "xyz.vh"/ {print "// " $0; next} 1' file.txt
对于所有其他awk
实现,请使用临时文件:
awk '/`include "xyz.vh"/ {print "// " $0; next} 1' file.txt >file.txt.tmp && \
mv file.txt.tmp file.txt
对于从当前目录开始的所有文件,递归地:
find . -type f -exec awk -i inplace '/`include "xyz.vh"/{print "// " $0; next} 1' {} \;
find . -type f -exec sh -c 'awk "/`include "xyz.vh"/ {print "// " $0; next} 1" "$1" \
>"$1".tmp && mv "$1".tmp "$1"' _ {} \;