我有几个.c
个文件,我希望找到包含printf
的行,对于这些行,我想在它们之前添加//
来注释掉代码。我可以使用python读取每个文件,进行转换,然后编写转换后的文本,但它太复杂了。还有其他简单的方法吗?我考虑了sed
和awk
之类的内容,但我不知道如何编写表达式,或者是否可以使用sed
/ {{1}来完成此任务}。
答案 0 :(得分:5)
使用sed
:
sed '/printf/s~^~//~g' *.c
@SLePort建议,
sed 's~.*printf~//&~' *.c
使用-i
进行就地编辑。
准确匹配的另一种方法printf
(假设printf
始终以换行符开头):
sed 's~^\([\t ]*\)\(printf\)~\1//\2~g' file
答案 1 :(得分:3)
在awk中。它没有经过测试,因为没有样本数据,我没有.c文件:
$ awk '/printf/ { sub(/^/,"//") } 1' *.c
说明:
/printf/
了解printf
上的记录sub(/^/,"//")
添加到记录//
1
隐式打印此解决方案将输出打印到stdout,这对于处理多个文件可能有点问题。解决这个问题的一种方法是使用Gnu awk v.4.1.0或更高版本以及 inplace edit :gawk -i inplace
。
另一种方法是输出到其他文件,例如将隐式打印更改为{ print > "edited-" FILENAME }
以将每个编辑的文件打印到新文件(例如file.c
到edited-file.c
)。坦率地说,我自己会使用@ sat的sed
解决方案。
答案 2 :(得分:3)
使用ed
,自UNIX
以来可用的标准编辑器 - 天(便携式,POSIX
兼容)和循环来进行就地替换,
for i in *.c; do
printf '%s\n' ",g/printf/ s/^/\/\//" w q | ed -s -- "$i"
done
在,
,g/printf/ s/^/\/\//
,g/printf/
标记包含printf
和s/^/\/\//
的所有行,将//
添加到这些行。然后wq
写入文件并随后关闭它。
在一行中使用命令行友好版本,
for i in *.c; do printf '%s\n' ",g/printf/ s/^/\/\//" w q | ed -s -- "$i"; done
(或)使用ex
编辑器命令行等效于Vim
for i in *.c; do printf '%s\n' "%g/printf/ s/^/\/\//" w q | ex -s "$i"; done
答案 3 :(得分:1)
sed '/printf/ s/^/\/\//' filename