我想删除一个特定字符串后面出现的所有换行符,并用制表符替换它们。比如说,我的 sample.txt 文件内容如下:
foo
bar bar bar bar some text
我希望它如此
foo bar bar bar bar some text
我该如何通过bash/awk/sed实现这个操作。帮帮我。
我想删除一个特定字符串后面出现的所有换行符,并用制表符替换它们。比如说,我的 sample.txt 文件内容如下:
foo
bar bar bar bar some text
我希望它如此
foo bar bar bar bar some text
我该如何通过bash/awk/sed实现这个操作。帮帮我。
awk '/foo$/ { printf("%s\t", $0); next } 1'
Here is how:
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
cat
。你可以直接将文件名传递给 sed
。 - Luis Lavaire.perl -pe 's/(?<=foo)\n/\t/' input
这可能适合您:
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
#!/bin/sed -f
/foo/{
N
s/\n/\t/
}
sed -e '/foo/N;y/\n/\t/' <sample.txt
解释: N
添加一个换行符和下一行的输入;y/\n/\t
将所有换行符替换为制表符,或者 s/\n/\t/
将第一个换行符替换为制表符。
请注意,由于 sed
是面向行的,输入中的换行符被视为行分隔符而不是行的一部分(这与 Perl 不同)。
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
并非所有工具都能进行换行符替换。Perl可以:
cat file.txt | perl -p -e 's/\n/ /g'
嗯,不确定这是否符合您的要求,但我会在vim中完成这个操作:
:g/^foo$/join
或者,如果 foo 可能出现在一行的任何位置:
:g/foo$/join
:%s/foo\n/foo\t/g
也可以很好地完成这个任务。我找不到一个纯Bash的例子,实际上这是一个符合POSIX标准的Bourne shell示例,这是它:
#!/bin/bash
while read line
do
case "$line" in
foo ) printf "${line}\t";
;;
* ) printf "${line}\n";
esac
done <file.txt
while
循环,对于read
程序读取的每一行,都将该行存储在名为line
的变量中(我们将其称为"${line}"
),do
启动循环中的工作。我们使用case
检查该行是否等于foo
,如果是,则使用printf
打印该行后跟一个(printf
不会打印换行符,除非您指示它这样做),我们指定;;
,以便它继续执行(它不会尝试另一个匹配,*
也将匹配foo
并再次打印foo
后跟一个换行符,因此,对于所有其他不匹配foo
的行,我们使用printf
打印带有换行符结尾的行。esac
结束了case语句。done
结束了while循环,<file.txt
指令将文件file.txt
发送到read
的标准输入(stdin)进行处理。如果你确定你的字符串不包含回车符(\r
),你可以这样做:
echo "$string" | tr '\n' '\r' | sed 's/foo\r/foo\t/g' | tr '\r' '\n'
tr
将所有换行符 (\n
) 替换为回车符 (\r
)sed
将所有字符串 foo\r
的出现替换为 foo\t
tr
反转了换行符 / 回车符的替换。