Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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
Regex 包括换行符的sed替换_Regex_Awk_Sed - Fatal编程技术网

Regex 包括换行符的sed替换

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。例

我想更改一个文本文件,以便将以“Length:”开头的任何行追加到前一行

我知道
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