我喜欢做的是在搜索行的末尾附加一些额外的文本。
我在这里找到了解决办法:
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

我做错什么了吗?还是行为得当?

最佳答案

如果源文件(或者不太可能是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样式的换行符的设置。

关于linux - 查找行并在末尾附加文本不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56576687/

10-11 17:44