查找行并在末尾添加文本不起作用

时间:2019-06-13 08:44:15

标签: linux bash

我想做的是在搜索到的行末添加一些额外的文本。

我在这里找到了解决方案: Find a line in a file and add something to the end of the line in bash

但是,当我尝试使用sed或awk而不是将其附加到末尾时,它将替换搜索到的字符串。

我的命令:

sed 's/^string_for_search.*/& text_to_append/' file

我做错了什么还是适当的行为?

2 个答案:

答案 0 :(得分:0)

如果源文件(或不太可能sed命令本身)包含回车符(ASCII 0x13,通常写为\r),则可能会发生这种情况。

这些字符是组成Windows换行符的两个字符之一,因此,如果源文件是在Windows上创建的,则源文件很可能包含它们。但是,在Linux上,它们从字面上解释为向"return the carriage"的信号,并在行的开头开始写回。

具有以下内容的文件:

string_for_search\r\n
string_for_search\r\n
whatever\r\n

您的sed命令将其转换为

string_for_search\r text_to_append_which_i_assume_is_longer\n
string_for_search\r text_to_append_which_i_assume_is_longer\n
whatever\r\n

显示如下:

 text_to_append_which_i_assume_is_longer
 text_to_append_which_i_assume_is_longer
whatever

您可以通过将输出传递到显示特殊字符的cat -A来检查这是否是您的实际问题:您应该希望看到原始行,后跟一个^M代表回车,其后是您的替换模式和一个$代表\n换行符:

string_for_search^M text_to_append_which_i_assume_is_longer$
string_for_search^M text_to_append_which_i_assume_is_longer$
whatever^M$

如果确实存在问题,那么解决方案是从源文件中删除\r,您可以使用dos2unix实用程序(如果可用)或tr -d '\r'来完成。产生数据的软件可能也进行了设置,以避免使用Windows样式的换行符。

答案 1 :(得分:0)

您要查找的语法是:

sed 's/^\(string_for_search.*\)/\1 text_to_append/' file

示例:

$ cat ~/tmp/t
Hello
World

$ sed 's/\(Hello.*\)/\1, hello/' ~/tmp/t
Hello, hello
World