如何编写sed、awk或其他正则表达式单行来连接以match开头的连续行?



我有一些文件以我想在连续组中匹配的值开头,然后删除它们之间的新行字符。"连续groups"这意味着我们只想删除匹配行对之间的换行符。Diffs提供了一个方便的例子:假设我们想要删除添加行之间的新行字符,即所有以加号+开头的行。

对问题的答案进行调整,但只对配对进行分组,而不是继续对以下所有匹配行进行分组:

sed '/^+/N;s/n+/ /' path/to/file.diff

(注意,输入和预期输出也将以空格开头的行连接在一起。这是我的一个格式错误,并且已经编写了非常有用的答案来回答输出中表达的意图,因此我留下了这样的答案,以免使它们无效。

示例输入:

--- some/file/path  2021-02-21 16:33:40.000000000 -0600
+++ another/file/path   2021-02-21 16:33:52.000000000 -0600
@@ -32,7 +32,7 @@
this
sentence
-lost
-many
+gained
+several
+other
words
@@ -91,9 +91,10 @@
this
one
-just
-lost
-many
所需输出:

--- some/file/path  2021-02-21 16:33:40.000000000 -0600
+++ another/file/path   2021-02-21 16:33:52.000000000 -0600
@@ -32,7 +32,7 @@
this sentence
-lost 
-many
+gained several other
words
@@ -91,9 +91,10 @@
this one
-just 
-lost 
-many

这可能适合您(GNU sed):

sed -E ':a;N;s/^(([+ ]).*)n2/1 /;$!ta;P;D' file

添加下一行

如果第一行以+开头,并且第二行以相同的字符开头,则删除换行符和重复字符并将其替换为空格。

重复此过程,直到匹配失败。

打印/删除第一行并重复。

将以+字符开头的相邻行连接起来的sed单行:

sed -e ':a' -e '$!N;s/^(+.*)n+/1 /;ta' -e 'P;D' file

这个awk解决方案稍微扩展了1行代码的概念,但是对于长一行代码的标准来说还不错,例如

awk '
!found && /^+[^+]/ { printf "%s", $0; found=1; next }
/^[^+]/  { printf (found?"n%sn":"%sn"), $0; found=0; next }
found    { printf " %s", substr($0,2); next }
{ print }
' file

使用/输出示例

使用创造性地命名为file的文件中的输入,您可以选择-复制和鼠标中键-粘贴到当前目录下的文件的xterm中,并且可以:

$ awk '
>     !found && /^+[^+]/ { printf "%s", $0; found=1; next }
>     /^[^+]/  { printf (found?"n%sn":"%sn"), $0; found=0; next }
>     found    { printf " %s", substr($0,2); next }
>              { print }
> ' file
--- some/file/path  2021-02-21 16:33:40.000000000 -0600
+++ another/file/path   2021-02-21 16:33:52.000000000 -0600
@@ -32,7 +32,7 @@
this
sentence
-lost
-many
+gained several other
words
@@ -91,9 +91,10 @@
this
one
-just
-lost
-many

注意:您的问题陈述讨论的只是连接以'+'开头的行,但是您期望的输出还连接diff位置信息之后的前两行。不清楚你是想要一个,另一个,还是两个都要?

像这样应该可以工作

$ awk '{p=substr($0,1,1); 
if(p!=pp && pp!="-") printf "n"; 
pp=p; 
printf "%s%s",$0,p=="-"?"n":""}' file
--- some/file/path  2021-02-21 16:33:40.000000000 -0600
+++ another/file/path   2021-02-21 16:33:52.000000000 -0600
@@ -32,7 +32,7 @@
this sentence
-lost
-many
+gained+several+other
words
@@ -91,9 +91,10 @@
this one
-just
-lost
-many

相关内容

  • 没有找到相关文章

最新更新