我一直在努力解决以下问题。我有大约800个这种格式的文件,我一直在尝试编写一个sed / awk脚本来修复。
该文件将如下所示
symbols
V2:1.2
v1:1.1
locks; strict;
基本上,如果下一行包含单词locks; strict;
,我需要将其转换为在符号的最后一行添加分号。
输出应该看起来像
symbols
V2:1.2
v1:1.1;
locks; strict;
答案 0 :(得分:1)
您可以使用N
命令将下一行加载到模式空间中,如果模式在换行符后包含locks; strict;
,则在换行符之前插入分号:
$ sed 'N;s/\n.*locks;.*strict.*/;&/;P;D' infile
symbols
V2:1.2
v1:1.1;
locks; strict;
编写locks; strict;
行的正则表达式,使其无论两个单词之间(或之前和之后)之间的匹配如何都匹配,例如word locks; more words strict; even more words
。如果仅当行包含locks; strict;
时才匹配,则必须将命令更改为
sed 'N;s/\nlocks; strict/;&/;P;D' infile
&
重复完整匹配,因此我们甚至不需要捕获组。 N;P;D
序列是在模式空间中一次保留两行的惯用方法:加载下一行,打印到换行符,删除到换行符。
答案 1 :(得分:1)
您可以使用awk
:
awk '/locks; strict;/{l=l";"}NR>1{print l}{l=$0}END{print l}' file
在多行版本中有更好的解释:
# script.awk
# If the pattern matches we append an ; to the last line (l)
/locks; strict;/ {
last = last";"
}
# If NR is greater than 1 print the last line.
# Note that in the first line, `last` is still undefined
# at this point.
NR>1 {
print last
}
# Set last line to current line
{ last = $0 }
# At the end of input print the last line
END {print last}
答案 2 :(得分:0)
另一种awk
方式是:
awk 'BEGIN{RS="\nlocks; strict\n";ORS=";\nlocks; strict\n"}{print}' your_file
另一种awk
方式:
awk 'BEGIN{RS="^$"}{$0=gensub(/\nlocks; strict\n/,";\nlocks; strict\n","g",$0); printf "%s",$0}' your_file