Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 文本处理-将下一行附加上一行,直到行以“结束”^&引用;_Shell_Unix_Sh_Ksh - Fatal编程技术网

Shell 文本处理-将下一行附加上一行,直到行以“结束”^&引用;

Shell 文本处理-将下一行附加上一行,直到行以“结束”^&引用;,shell,unix,sh,ksh,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^th

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

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^

一个便宜而简单的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"
#/bin/bash
文件名=$HOME/asdf.txt
prevLine=“”
而IFS=读取-r变量
做
如果[[$var=~^[0-9]{1}\^.*$]]
然后
回显“$prevLine”
prevLine=“”
prevLine=“$var”
其他的
prevLine+=“$var”
fi
完成<“$filename”
回显“$prevLine”

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

$awk'{ORS=/\^$/?“\n”:“}1”文件
1 ^0^这是测试文件行1^
2^1^这是测试文件第2行^
3^1^这是测试文件第3行^
4^1^这是文件行4^
使用GNU sed 4.2(支持-z选项),您可以使用

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

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

另一个sed,使用鲜为人知的保持空间:

$ 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^
基本上:如果当前行(模式空间)没有以^结尾,则将其附加到保留空间并继续下一行。否则,再次将当前行附加到保留空间,然后用保留空间替换当前图案空间,处理由
H
添加的换行符,并打印结果。然后清空保持空间,为下一行序列做准备(不幸的是,在一个步骤中完成最后一点似乎并不容易)

注:

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

您尝试过什么?你面临的问题是什么?任何错误?awk-F'^''NR>1{printf prev(NF>1?\n:“)}{prev=$0}END{print prev}'text.txt>text1.txtline3和第4行以
^
结尾,输入是否正确?我将更正问题标题,我希望得到上述输出的结果为什么第2行和第3行没有附加到第1行?
$ 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^