找到带有特定字符串的行,然后将其删除';在bash的末尾添加换行符
我正在准备一份报告的文件。我所拥有的是这样的:找到带有特定字符串的行,然后将其删除';在bash的末尾添加换行符,bash,newline,Bash,Newline,我正在准备一份报告的文件。我所拥有的是这样的: foo bar bar oof bar oof foo bar bar foo bar bar oof bar off foo bar bar 我试图得到如下输出: foo bar bar oof bar oof foo bar bar foo bar bar oof bar off foo bar bar 我想搜索一个字符串,在本例中是“foo”,在找到该字符串的行中,我必须删除换行符 我确实搜索过,但我只能找到同时删除“
foo
bar bar oof
bar oof
foo
bar bar
foo bar bar oof
bar off
foo bar bar
我试图得到如下输出:
foo
bar bar oof
bar oof
foo
bar bar
foo bar bar oof
bar off
foo bar bar
我想搜索一个字符串,在本例中是“foo”,在找到该字符串的行中,我必须删除换行符
我确实搜索过,但我只能找到同时删除“foo”的解决方案。我该怎么做 使用
sed
,您可以很容易地做到这一点,例如:
$ sed '/^foo$/N;s/\n/ /' file
foo bar bar oof
bar oof
foo bar bar
解释
/^foo$/
查找仅包含foo的行
N
在模式空间中读取/追加下一行输入s/\n/
用空格替换'\n'
使用
awk
:
awk -v search='foo' '$0 ~ search{printf $0; next}1' infile
如果您的字段在换行符之前没有前导空格,您可以像下面一样使用printf$0
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'
-set变量search
$0~搜索
-如果行/记录/行包含变量中提到的regexp/pattern/string
{printf$0;next}
-不使用记录分隔符打印当前记录并转到下一行
}1
1结尾处执行默认操作,即打印当前记录/行
成功了!我是“sed”的新手,不知道“^”、“$”和“N”的用法;美国国旗。谢谢,加入俱乐部sed
是一种需要慢慢消化的动物。有点像吃鲸鱼。。。每次咬一口:)
我意识到我需要包含foo
的行,不管它是否是行中唯一的字符串。因此,我将^foo$
替换为简单的foo
。对我有效。祝您的脚本编写顺利(以及sed
和awk
)。在shell、awk
和sed
之间的Linux机器上几乎没有什么做不到的。加在一起就是文字处理的瑞士军刀。我确实意识到我需要“打印F$0 OFS”的空间。这也行得通。非常感谢。