我有一些文件以我想在连续组中匹配的值开头,然后删除它们之间的新行字符。"连续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