簡體   English   中英

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 $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;

它根據行是否以policy開頭來設置更改行的輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM