sed替换包括换行符

时间:2015-07-13 08:58:45

标签: regex awk sed

我想更改一个文本文件,以便任何以&#34开头的行;长度:"附加到上一个行。

我知道sed '/\nLength:/ Length:/'无法正常工作,因为sed是基于行的。

Google搜索"如何匹配sed中的换行符"确实找到了一种复杂的sed方法,用于将模式加入 next 行,但我无法弄清楚如何调整它。

帮助将不胜感激。

3 个答案:

答案 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

这会将下一行追加到模式空间中的当前行,如果附加的行以所需的字符串开头,则用空格替换换行符(如果您不希望空格只替换换行符)。然后打印并删除第一行并重复该过程(第二行现在是第一行,除非符合条件,在这种情况下会自动读入一行,然后第一个命令追加下一行)。