如何查找文本文件的特定行并对其进行操作?

时间:2017-01-17 06:25:47

标签: bash awk sed

我有几个.c个文件,我希望找到包含printf的行,对于这些行,我想在它们之前添加//来注释掉代码。我可以使用python读取每个文件,进行转换,然后编写转换后的文本,但它太复杂了。还有其他简单的方法吗?我考虑了sedawk之类的内容,但我不知道如何编写表达式,或者是否可以使用sed / {{1}来完成此任务}。

4 个答案:

答案 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.cedited-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/标记包含printfs/^/\/\//的所有行,将//添加到这些行。然后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