通过bash / awk / sed / perl删除特定文本后的新行

时间:2011-12-15 11:45:24

标签: bash sed awk

我想删除在一个partiular字符串后面出现的所有换行符,并将其替换为制表符空格。比方说我的sample.txt如下

foo
bar bar bar bar some text

我希望它是

foo    bar bar bar bar some text

我如何通过bash / awk / sed执行此操作。帮忙。

8 个答案:

答案 0 :(得分:12)

在awk中:

awk '/foo$/ { printf("%s\t", $0); next } 1'

答案 1 :(得分:7)

以下是:

cat input.txt | sed ':a;N;$!ba;s/foo\n/foo\t/g'

有关简单sed 's/foo\n/foo\t/g'无效的原因的更多信息:http://linuxtopia.org/online_books/linux_tool_guides/the_sed_faq/sedfaq5_009.html

答案 2 :(得分:4)

perl -pe 's/(?<=foo)\n/\t/' input

答案 3 :(得分:3)

这可能对您有用:

echo -e "foo\nbar bar bar bar some text"| sed '/foo$/{N;s/\n/\t/}'
foo     bar bar bar bar some text

实际上:

echo -e "foo\nbar bar bar bar some text"| sed '/foo$/N;s/\n/\t/'
foo     bar bar bar bar some text

后一种解决方案效率较低,但不是很多!

答案 4 :(得分:2)

并非所有工具都可以进行换行。 Perl可以:

cat file.txt | perl -p -e 's/\n/ /g'

答案 5 :(得分:2)

嗯。不确定这符合你的要求,但我会在vim中这样做:

:g/^foo$/join

或者,如果foo可以在一条线上的任何地方:

:g/foo$/join

当然,:%s/foo\n/foo\t/g也会做得很好

答案 6 :(得分:1)

perl -pe 's/foo\n/foo\t/g' temp2.txt

以下是测试。

243> cat temp2.txt 
foo
bar bar bar bar some text 
pearl[ncm_o12.2_int_x86.@2].244> perl -pe 's/foo\n/foo\t/g' temp2.txt
foo     bar bar bar bar some text 

答案 7 :(得分:0)

sed版本看起来像

#!/bin/sed -f
/foo/{
N
s/\n/\t/
}

如果您想在sed命令中执行此操作,则可以将上述内容简化为单行:

sed -e '/foo/N;y/\n/\t/'  <sample.txt

说明:N附加换行符和下一行输入; y/\n/\t用标签替换所有换行符,或s/\n/\t/用标签替换第一个换行符。

请注意,由于sed是面向行的,因此输入中的换行符被视为行分隔符,而不是任何行的一部分(这与Perl相反)。