Bash 匹配多行字符串并附加到上一行
Bash match string in multiple lines and append to previous line
我正在尝试用这些行转换文本文件:
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 [=10=]; 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 '{=;printf (/^policy/ &&NR>1?RS:"")"%s",[=10=]} END {print ""}' file
policy rule {source-address host1;destination-address host2;application http;
policy someotherrule {source-address any;destination-address [ host2 host3];application ssh;
它根据行是否以 policy
开头来设置行输出的变化。
我正在尝试用这些行转换文本文件:
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 [=10=]; 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 '{=;printf (/^policy/ &&NR>1?RS:"")"%s",[=10=]} END {print ""}' file
policy rule {source-address host1;destination-address host2;application http;
policy someotherrule {source-address any;destination-address [ host2 host3];application ssh;
它根据行是否以 policy
开头来设置行输出的变化。