Regex 基于模式的直线合并
您是否可以建议使用sed/awk命令合并文件中以图案开头、以括号结尾的行;匹配是可变行号的,并由右括号控制 例如,对于以下输入,提取模式以pattern1作为开始,以“}”结束Regex 基于模式的直线合并,regex,awk,sed,Regex,Awk,Sed,您是否可以建议使用sed/awk命令合并文件中以图案开头、以括号结尾的行;匹配是可变行号的,并由右括号控制 例如,对于以下输入,提取模式以pattern1作为开始,以“}”结束 blah blah pattern1 { blah blah 1 blah blah 2 blah blah 3 } pattern1 { blah blah 1 blah blah 2 } 预期产量为 blah blah partern1 {blah blah 1 blah blah 2 blah blah 3}
blah blah
pattern1 {
blah blah 1
blah blah 2
blah blah 3
}
pattern1 {
blah blah 1
blah blah 2
}
预期产量为
blah blah
partern1 {blah blah 1 blah blah 2 blah blah 3}
partern1 {blah blah 1 blah blah 2}
这就解决了你在AWK中的问题,通过记录我们是否处于一个模式的中间,并作用于它。假设您的输入文件名为input.txt:
awk '/{/ {
inPattern=1
}
{
if (inPattern) {
# When in a pattern, print the line (because of printf, this is without the newline).
printf "%s ",$0;
} else {
# Otherwise, just print the line.
print;
}
}
/}/ {
inPattern=0
# Do this to go to a new line.
print ""
}' input.txt
祝你好运 使用GNU时:
$ sed '/pattern1/ {:x; N; s/\n/ /; /}/! bx}' infile
blah blah
pattern1 { blah blah 1 blah blah 2 blah blah 3 }
pattern1 { blah blah 1 blah blah 2 }
说明:
如果要用变量替换pattern1
,则必须以不同的方式引用:
$ var=pattern1
$ sed "/$var/ {:x; N; s/\n/ /; /}/! bx}" infile
这里有一个可移植的sed解决方案(适用于GNU sed、OSX、FreeBSD等),尽管它适用于所有模式,而不仅仅是匹配
/pattern1/
的部分:
sed -ne '/{/{;x;/}/d;p;x;h;d;}; /}/! {;H;d;}; /}/{;H;x;s/\n/ /g;};p' file
为了便于阅读,该脚本如下所示:
-对于任何包含开口括号的行(/{/{;
)。。。{
-打印它..除非它是右括号,然后将它添加到我们的保留中x;/}/d;p;x;h;d;};
/}/!{;H;d;}代码>-对于没有右括号的任何行,请将其附加到我们的保留中
/}/{;H;x;s/\n//g;}代码>-对于任何带有右大括号的行,请附加它,交换保留空格和填充空格,并用换行符替换空格
-并打印结果(因为我们有一个p
作为sed选项)-n
请注意,如果模式中有嵌入的模式,那么这肯定会失败。要处理这种情况,您需要使用一种实际的语言,例如,它可以在嵌套层遍历您的文件时跟踪嵌套层。这对我在OSX或FreeBSD中使用不起作用。您是否正在使用GNU sed?如果是这样的话,最好在你的答案中详细说明这一点,以便读者知道你的答案是不可移植的。@ghoti是的,我使用的是GNU sed。让我检查一下是否可以让它便携。@ghoti这么说,它使用
--posix
标志对我有效。什么对您不起作用?sed:1:“/pattern1/{:x;N;s/\N…”:意外的EOF(挂起的})
是我在FreeBSD和OSX中看到的错误。起初我认为问题可能是您使用了\n
,这也是不可移植的,但当我尝试运行sed-e$'/pattern1/{;:x;n;s/\\\n/;/}时!bx;}'文件
,(带有额外的行分隔符),我得到了一个错误,sed:2:“/pattern1/{;:x;N;s/…”:无效的命令代码;
。这里的内容比我现在调试的时间还多,所以..祝你好运。@ghoti可能是未替换的
。我不确定在没有访问FreeBSD/OSX sed的情况下是否可以正确调试此程序。不过,我会读一下便携式sed:)哦,而且\n
不是便携式的吗?FreeBDS/OSX sed是否不符合POSIX?说明支持\n
。
sed -ne '/{/{;x;/}/d;p;x;h;d;}; /}/! {;H;d;}; /}/{;H;x;s/\n/ /g;};p' file