找到一个包含某个字符串的行,然后在bash的末尾删除它的换行符

时间:2017-10-18 09:10:27

标签: bash newline

我正在尝试为报告准备文件。我拥有的是这样的:

foo 
bar bar oof 
bar oof 
foo 
bar bar

我正在尝试获得这样的输出:

foo bar bar oof
bar off
foo bar bar

我想搜索一个字符串,在本例中为'foo',并且在找到字符串的行内我必须删除换行符。

我做了搜索,但我只能找到'foo'也被删除的解决方案。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

使用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 - 如果行/记录/行包含变量中提到的regexp / pattern / string
  • {printf $0; next} - 打印没有记录分隔符的当前记录并转到下一行
  • 最后的
  • }1 1执行默认操作,即打印当前记录/行。

答案 1 :(得分:0)

您可以使用sed轻松完成此操作,例如:

$ sed '/^foo$/N;s/\n/ /' file
foo bar bar oof
bar oof
foo bar bar

<强>解释

  1. /^foo$/查找仅包含foo

  2. 的行
  3. N读取/追加下一行输入到模式空间。

  4. s/\n/ /'\n'替换为space