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