如果下一行与模式匹配,则插入分号

时间:2016-05-31 13:23:22

标签: bash awk sed

我一直在努力解决以下问题。我有大约800个这种格式的文件,我一直在尝试编写一个sed / awk脚本来修复。

该文件将如下所示

symbols
    V2:1.2
    v1:1.1
locks; strict;

基本上,如果下一行包含单词locks; strict;,我需要将其转换为在符号的最后一行添加分号。

输出应该看起来像

symbols
    V2:1.2
    v1:1.1;
locks; strict;

3 个答案:

答案 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