awk连接字符串直到包含子字符串

car*_*ray 5 regex bash awk

我有一个awk来自这个例子的脚本:

awk '/START/{if (x) print x; x="";}{x=(!x)?$0:x","$0;}END{print x;}' file
Run Code Online (Sandbox Code Playgroud)

这是一个带有行的示例文件:

$ cat file
START
1
2
3
4
5
end
6
7
START
1
2
3
end
5
6
7
Run Code Online (Sandbox Code Playgroud)

所以我需要在目标字符串包含end单词时停止连接,因此所需的输出是:

START,1,2,3,4,5,end
START,1,2,3,end
Run Code Online (Sandbox Code Playgroud)

Rom*_*est 8

简短的Awk解决方案(虽然它会检查/end/模式两次):

awk '/START/,/end/{ printf "%s%s",$0,(/^end/? ORS:",") }' file
Run Code Online (Sandbox Code Playgroud)

输出:

START,1,2,3,4,5,end
START,1,2,3,end
Run Code Online (Sandbox Code Playgroud)
  • /START/,/end/- 范围模式

范围图案由用逗号分隔两个图案,在形式‘begpat, endpat’.它用于匹配连续输入记录的范围.第一个模式begpat控制范围开始的位置,同时endpat控制模式结束的位置.

  • /^end/? ORS:"," - 为范围内的当前项设置分隔符

  • 永远不要使用范围表达式,因为它们使得琐碎的脚本非常简单或需要完全重写或重复条件(例如,在这种情况下测试"结束"两次)当需求变得更有趣时.始终使用标志变量,例如/sf/answers/3345749641/ (2认同)