文本处理-在上一行之后添加下一行,直到各行以“ ^”结尾

时间:2019-03-26 12:16:39

标签: shell unix sh ksh

我有一个文本文件,其中包含以下格式的数据。

1^0^this is test file line1^
2^1^this is test file line2^
3^1^this
is
test
file line3^
4^1^this
is
file line4^

直到下一行以^结尾,它需要在前一行后面添加

输出:

1^0^this is test file line1^
2^1^this is test file line2^
3^1^this is test file line3^
4^1^this is file line4^

4 个答案:

答案 0 :(得分:3)

根据行尾操作输出记录分隔符(ORS)的值。

$ awk '{ORS=/\^$/?"\n":" "}1' file
1^0^this is test file line1^
2^1^this is test file line2^
3^1^this is test file line3^
4^1^this is file line4^

答案 1 :(得分:0)

便宜又轻松的bash脚本。而不是查找结尾的胡萝卜,而是查找开头的数字和胡萝卜。

#!/bin/bash

filename=$HOME/asdf.txt
prevLine=""
while IFS= read -r var
do
    if [[ $var =~ ^[0-9]{1}\^.*$ ]]
    then
        echo "$prevLine"
        prevLine=""
        prevLine="$var"
    else
        prevLine+=" $var"
    fi
done < "$filename"
echo "$prevLine"

答案 2 :(得分:0)

使用GNU sed 4.2(支持-z选项),您可以使用

textCellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());

使用较旧的sed -rz 's/([^^])\n/\1/g' file ,您可以使用

sed

编辑:如果要在连接的行之间留空格,请使用

tr "\n" "\r" < file | sed -r 's/([^^])\r/\1/g' | tr "\r" "\n"

答案 3 :(得分:0)

另一个人使用鲜为人知的保留空间来保存一个人

$ sed -ne '/[^^]$/{H;d}; {H;g;s/\n/ /g;p;s/.*//;h}' test.txt; 
^1^0^this is test file line1^
^2^1^this is test file line2^
^3^1^this is test file line3^
^4^1^this is file line4^

基本上:如果当前行( pattern space )的结尾不是^,请将其附加到 hold space 并继续下一行。否则,再次将当前行追加到保留空间,然后用保留空间替换当前模式空间,处理H添加的换行符,然后打印结果。然后清空保持空间,为下一行代码做准备(不幸的是,一步一步完成这件事似乎并不容易)

注意:

  • 如果输入的最后一行不以^结尾,则会出现问题。
  • 如果使用GNU sed,请将s/.*//替换为z