bash - 如何在异常情况下对文件中的行进行编号(bash 或 sed)

标签 bash sed

我想对我的输入文件中除此之外与我的正则表达式匹配的所有行进行编号。例如:

输入文件:

some text 12345
some another text qwerty
my special line
blah foo bar

正则表达式:^我的

输出:

1 some text 12345
2 some another text qwerty
my special line
3 blah foo bar

最佳答案

awk 可以很容易地做到这一点。 awk 脚本:

!/^my/ {
  cnt++;
  printf "%d ", cnt
}
{
  print
}

这意味着:对于与表达式不匹配的所有行,增加变量 cnt(从零开始)并打印该数字后跟一个空格。然后打印整行。

演示:

 $ awk '!/^my/{cnt++; printf "%d ", cnt} {print}' input 
1 some text 12345
2 some another text qwerty
my special line
3 blah foo bar

浓缩版感谢Thor :

$ awk '!/^my/{$0=++cnt" "$0} 1' input 

这通过修改整行 ($0) 当行与表达式不匹配时(在预递增的计数器之前)。
第一个 pattern{action} 对之后的 1 本身就是一个 pattern{action} 对,省略了 action 部分。 1始终为真,因此始终执行该操作,未指定时的默认操作为{print}。而没有参数列表的 print 等同于 print $0,即打印整行。

关于bash - 如何在异常情况下对文件中的行进行编号(bash 或 sed),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12128478/

相关文章:

linux - Bash shell "Join"命令无法识别操作数

linux - ffmpeg 将 .avi、.mp4、.mp3、.flv、.mkv 转换为 mp4

linux - 获取按时间排序的文件名

bash - 如何递增字符串中的最后一个数字;狂欢

sed/awk/cut/grep - 提取字符串的最佳方法

linux - 使用 sed 提取多个值

regex - 使用 sed 替换目录中所有文件中的字符串

linux - 使用 Bash 脚本进行多线程编程

linux - Bash:根据另一个文件中的行更改文件头

linux - awk 脚本匹配模式,然后删除分隔符后的整行