查找带有特定字符串的行,然后在bash中删除它的换行符字符
问题描述:
我正在尝试为报表准备文件。我已经是这样的:查找带有特定字符串的行,然后在bash中删除它的换行符字符
foo
bar bar oof
bar oof
foo
bar bar
我想要得到这样的输出:
foo bar bar oof
bar off
foo bar bar
我想搜索字符串,在这种情况下,“富”,和内找到字符串的行我必须删除换行符。
我做了搜索,但我只能找到'foo'也被删除的解决方案。我怎样才能做到这一点?
答
你可以做到这一点很容易与sed
,例如:
$ sed '/^foo$/N;s/\n/ /' file
foo bar bar oof
bar oof
foo bar bar
说明只包含foo
N
读
/^foo$/
发现线/追加下一行输入模式空间。s/\n/ /
用space
替代'\n'
。
答
使用awk
:
awk -v search='foo' '$0 ~ search{printf $0; next}1' infile
您可以使用printf $0 OFS
像下面,如果你的领域没有换行字符之前前导空格
awk -v search='foo' '$0 ~ search{printf $0 OFS; next}1' infile
测试结果:
$ cat infile
foo
bar bar oof
bar oof
foo
bar bar
$ awk -v search='foo' '$0 ~ search{printf $0; next}1' infile
foo bar bar oof
bar oof
foo bar bar
说明:
-
-v search='foo'
- 设置变量search
-
$0 ~ search
- 如果线/记录/行包含变量 -
{printf $0; next}
提到的正则表达式/模式/字符串 - 打印当前记录没有记录分隔符,然后转到下一行 -
}1
1最后做默认操作,即打印当前记录/行。
+0
我知道我需要“printf $ 0 OFS”空间。这也适用。谢谢! – leafymilkfish
+0
不客气 –
它的工作!我刚接触'sed',不知道'^','$','N; s'标志的用法。谢谢。 – leafymilkfish
加入俱乐部。 “sed”是你必须慢慢消化的动物之一。有点像吃鲸鱼......每次只吃一口'')' –
我意识到我需要包含'foo'的行,不管它是否是唯一的字符串。所以我用'foo'替换了'^ foo $'。 – leafymilkfish