通过分隔的前缀在文本组之间添加空行

时间:2019-05-24 15:34:54

标签: bash shell

我正在尝试按升序对某些编程语句进行排序和分组,以使源代码更易于阅读。到目前为止,我可以提取这些编程语句,并使用sort以升序对它们进行排序。

一些例子:

# Example 1
keyword ABC;
keyword ABC.DEF;
keyword ABC.GHI;
keyword ABC.JKL.MNO;
keyword ZYX;
keyword ZYX.RST;
keyword ZYX.WVU;

# Example 2
keyword ABC;
keyword ABC.DEF;
keyword ABC.GHI;
keyword ABC.JKL.MNO;

# Example 3
keyword ZYX;
keyword ZYX.RST;
keyword ZYX.WVU;

每行以keyword开头,后跟一个空格和一个文本,该文本可以分成多个部分,并用句点分隔。我想在以keyword ABC开头的最后一行和以keyword ZYX开头的第一行之间添加一个空行。但是,不能保证至少有以keyword ABC开头的一行和以keyword ZYX开头的一行。

2 个答案:

答案 0 :(得分:2)

如果您使用的是GNU sed,并且文件足够短,则执行多行替换的一个简单解决方案是使用-z标志:

sed -zE 's/(keyword ABC[^\n]*\n)(keyword ZYX)/\1\n\2/'

使用-z标志可以使sed忽略换行符,并使用\0作为记录分隔符,以便将整个文件作为单个记录读取(这就是为什么它们应该(不能太大)和\n可以匹配。然后,我们通过在两个连续的行之间添加一个额外的换行符来替换“ keyword ABC”和“ keyword ZYX”。

您可以try it here

答案 1 :(得分:1)

假设将这些行放在名为input.txt的文件中,以下代码将解决该问题:

last_first="0";
cat input.txt | while read line; do
    text=$(echo $line | awk '{print $2}');
    first=${text:0:1}
    if [ "$last_first" = "0" ]; then
        last_first="$first";
    elif [ "$last_first" != "$first" ]; then
        echo;
        last_first="$first";
    fi
    echo $text; 
done