Awk

合併模式後的每兩行直到下一個模式

  • January 18, 2022

文件.txt

String1?
word1
word2
word3
word4

String2?
word5
word6
word7
word8

期望的輸出:

String1?
word1 | word2
word3 | word4

String2?
word5 | word6
word7 | word8

唯一的模式是/?$/ 我試過的線條:

sed '/\?$/{n;:l N;/\?$/b; :a; N; $!b a; s/\n\s\{1,\}/ | /g; bl}'

但它沒有用。我目前的工作解決方案:

sed '/\?$/{:a;N;/\n....-..-.. /!s/\n/ - /;ta;P;D}' | sed 's/^[- ]*//g;s/[ -]*$//g'

…但這是一種解決方法,而且速度非常慢。任何人都可以幫助使用沒有管道的單個襯管,並且是一個快速的解決方案嗎?

如果不存在空行,如在 pattern 中,$\|^$,並且如果 ^ $ is not there and is having another line with ? $ ,那麼我們如何才能從 中保存緩衝區? $ to first non-greedy ? $ 模式,然後列印除最後一行以外的所有行並將最後一行與下一個模式緩衝區合併以進行搜尋?

僅限 GNU sed。

如果塊的所有行都恰好有 2 列(您的情況):

sed '/?$\|^$/b;N;s/\n/ | /' File.txt

如果奇數內容是可能的(通用方式):

sed '/?$\|^$/b;N;/\n$/!s/\n/ | /' File.txt

假設您的輸入是由空行分隔的文本塊,如範例輸入中所示,然後在每個 Unix 機器上的任何 shell 中使用任何 awk:

$ awk -v RS= -F'\n' -v OFS=' | ' '{print $1; for (i=2; i<NF; i+=2) print $i, $(i+1); print ""}' file
String1?
word1 | word2
word3 | word4

String2?
word5 | word6
word7 | word8

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