Text-Processing

如果文件中的兩行都符合模式,我該如何加入它們?

  • April 18, 2022

我有一個包含多行的文件,如果它們都符合特定模式,我想加入行。

我知道我可以找到適合該模式的線條並獲得下一行:

grep -E -A1 'Pattern' filename

但是我如何檢查下一行是否也符合模式,我將如何加入這兩者?

例如,我有一個這樣的文件:

Hello
i
am
John
Smith

範例模式可能如下:

'^[A-Z][a-z]+'

所以在這種情況下,如果它們都以大寫字母開頭,我想合併這些行。

我想要實現的輸出是:

Hello
i
am 
John Smith
/^[A-Z][a-z]+/{
 :a
 N
 /\n[A-Z][a-z]+/{
   s/\n/ /
   b a
 }
}

另存為join.sed並執行:sed -Ef join.sed file.

如果該行與模式匹配,我們將啟動一個循環,將下一行附加到模式空間並用空格替換換行符,只要該行也與模式匹配。

對於 GNU Sed,您可以將其折疊為單行:

sed -E '/^[A-Z][a-z]+/{:a;N;/\n[A-Z][a-z]+/{s/\n/ /;b a}}' file

或者,一個 Awk 腳本 ,join.awk其模式應為p

{
   if($0~p)c+=1
   else c=0
   printf "%s%s", (c>1 ? " " : ors), $0
   ors=ORS
}
END{print ""}

要執行:awk -f join.awk p='^[A-Z][a-z]+' file.

引用自:https://unix.stackexchange.com/questions/675722