Regex 包括换行符的sed替换
我想更改一个文本文件,以便将以“Length:”开头的任何行追加到前一行 我知道Regex 包括换行符的sed替换,regex,awk,sed,Regex,Awk,Sed,我想更改一个文本文件,以便将以“Length:”开头的任何行追加到前一行 我知道sed'/\nLength:/Length://'不起作用,因为sed是基于行的 谷歌搜索“如何在sed中匹配换行符”确实找到了一种复杂的sed方法,可以将一个模式连接到下一行,但我不知道如何调整它 非常感谢您的帮助。在awk中,您可以使用以下内容: awk '/^/&&!/^Length/{printf "\n"}{printf "%s",$0}' infile 仅当行开始^匹配时才会打印\n。例
sed'/\nLength:/Length://'
不起作用,因为sed
是基于行的
谷歌搜索“如何在sed中匹配换行符”确实找到了一种复杂的sed方法,可以将一个模式连接到下一行,但我不知道如何调整它
非常感谢您的帮助。在
awk
中,您可以使用以下内容:
awk '/^/&&!/^Length/{printf "\n"}{printf "%s",$0}' infile
仅当行开始
^
匹配时才会打印\n
。例外情况:Length
位于该开头。如果文件不是太大,可以在slurp模式下使用Perl命令行(在处理之前加载所有文件内容):
-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
这可能适用于您(GNU-sed):
这会将下一行追加到模式空间中的当前行,如果追加的行以所需字符串开头,则会用空格替换换行符(如果不需要空格,只需将换行符替换为零)。然后打印并删除第一行,并重复该过程(第二行现在是第一行,除非满足条件,在这种情况下自动读入一行,然后第一个命令追加下一行)。我个人更愿意将
printf“\n”
更改为print”“
(但这只是一种风格)。但是,您应该使用带有printf
的格式说明符,比如printf“%s”,$0
,以避免对行中的字符进行解释。我同意,格式化程序应该更清楚@tomfenech另一件小事-printf
不是一个函数,因此您不需要括号(事实上有些人更喜欢避免括号). 否则,看起来不错!谢谢太好了。谢谢你的例子和描述。
awk 'BEGIN{RS="\nLength:";ORS="Length:"}1' file | head -n -1
sed 'N;/\nLength:/s/\n/ /;P;D' file