Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash在多行中匹配字符串并附加到前一行_Linux_Bash_Awk_Sed - Fatal编程技术网

Linux Bash在多行中匹配字符串并附加到前一行

Linux Bash在多行中匹配字符串并附加到前一行,linux,bash,awk,sed,Linux,Bash,Awk,Sed,我正在尝试使用以下行打开文本文件: policy rule { source-address host1; destination-address host2; application http; policy someotherrule { source-address any; destination-address [ host2 host3]; application ssh; 进入: 因此,基本上,如果一行以分号结尾,则将其附加到前一行

我正在尝试使用以下行打开文本文件:

policy rule {
    source-address host1;
    destination-address host2;
    application http;
policy someotherrule {
    source-address any;
    destination-address [ host2 host3];
    application ssh;
进入:

因此,基本上,如果一行以分号结尾,则将其附加到前一行


我一直在玩sed/awk,但还没有找到一个有效的解决方案来获得所需的输出。

以下gnu awk应该可以工作:

awk -v RS='(^|\n)[^\n]*[^;]\n' 'NF{s=p $0; gsub(/(^|\n+)[[:blank:]]+/, " ", s); print s}
          {p=RT}' file
 policy rule { source-address host1; destination-address host2; application http;
 policy someotherrule { source-address any; destination-address [ host2 host3]; application ssh;

这个简单的一行程序可以:

perl -p0e 's/\n\s+/ /g' file
policy rule { source-address host1; destination-address host2; application http;
policy someotherrule { source-address any; destination-address [ host2 host3]; application ssh;
以下是一个awk解决方案:

awk '{$1=$1;printf (/^policy/ &&NR>1?RS:"")"%s",$0} END {print ""}' file
policy rule {source-address host1;destination-address host2;application http;
policy someotherrule {source-address any;destination-address [ host2 host3];application ssh;

它根据行是否以策略开始设置更改行的输出。

显示您的努力!你试过什么?你有什么疑问?
awk '{$1=$1;printf (/^policy/ &&NR>1?RS:"")"%s",$0} END {print ""}' file
policy rule {source-address host1;destination-address host2;application http;
policy someotherrule {source-address any;destination-address [ host2 host3];application ssh;