我想做的是在搜索到的行末添加一些额外的文本。
我在这里找到了解决方案: 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
我做错了什么还是适当的行为?
答案 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