我正在尝试按升序对某些编程语句进行排序和分组,以使源代码更易于阅读。到目前为止,我可以提取这些编程语句,并使用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
开头的一行。
答案 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