我想更改一个文本文件,以便任何以&#34开头的行;长度:"附加到上一个行。
我知道sed '/\nLength:/ Length:/'
无法正常工作,因为sed
是基于行的。
Google搜索"如何匹配sed中的换行符"确实找到了一种复杂的sed方法,用于将模式加入 next 行,但我无法弄清楚如何调整它。
帮助将不胜感激。
答案 0 :(得分:2)
在awk
中,您可以使用以下内容:
awk '/^/&&!/^Length/{printf "\n"}{printf "%s",$0}' infile
只有在匹配行开始\n
时才会打印^
。例外:在该开始时找到Length
。
答案 1 :(得分:1)
如果文件不是太大,您可以在slurp模式下使用Perl命令行(在处理之前加载所有文件内容):
perl -0777 -pe 's/\R(?=Length:)//g' file
-0777
启用了slurp模式
图案:
\R
任何类型的换行符
(?=...)
前瞻性断言
如果没有以Length:
开头的连续行,您可以使用此sed
命令:
sed -n ':a;/\nLength:/!{$p;N;ba;}; s/\n\(Length:\)/$1/;p;' file
细节:
:a; # define the label "a"
/\nLength:/! { # if "\nLength:" doesn't match then:
$p; # if last line, print
N; # append the next line to the pattern space
ba; # go to label "a"
};
s/\n\(Length:\)/$1/; # perform the replacement
p; # print
awk使用记录分隔符的另一种方法:
awk 'BEGIN{RS="\nLength:";ORS="Length:"}1' file | head -n -1
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed 'N;/\nLength:/s/\n/ /;P;D' file
这会将下一行追加到模式空间中的当前行,如果附加的行以所需的字符串开头,则用空格替换换行符(如果您不希望空格只替换换行符)。然后打印并删除第一行并重复该过程(第二行现在是第一行,除非符合条件,在这种情况下会自动读入一行,然后第一个命令追加下一行)。