重击:使用^ M污染的字符串附加文本

时间:2019-04-18 09:38:09

标签: sed carriage-return

这个问题的重点转移了一点,真正的问题在下面的编辑2中解决。一开始的问题:

我想在文件的所有行中附加一个简单的字符串,例如字母N。这必须在不引入换行符的情况下发生。我需要的是这样的:

file     result
Aa       AaN
Bb       BbN
C        CN
Dd       DdN

到目前为止我唯一发现的是

sed -e 's/../&N/'

仅将字符串附加在特定位置,因此对于字符长度不同的条目,此操作将无效,因为结果如下所示:

AaN
BbN
C
N
DdN

最简单的类比是

sed -e 's/^/&N/' file

每行加上。因此,我需要^的反向参数,无论该行中的字符串有多长,它都允许我将其追加到每一行。我发现有关附加的其他问题引入了其他一些不适用于此处的约束。


编辑: 建议

sed 's/$/N/' file > file2

仅更改文件中的最后一行。而我需要在每一行中进行更改。它似乎在链接的问题中起作用,但在这里却没有。我不知道为什么。


编辑2:

正如RavinderSingh13指出的那样,我通过其他一些命令获得的列表包含^M个字符。因此,使用

cat -v file

真实内容被揭露:

Aa^M
Bb^M
C^M
Dd^M

提出的解决方案能够解决此问题!

3 个答案:

答案 0 :(得分:1)

如果您对awk感到满意,则可以直接使用print代替替代。

awk '{gsub(/\r/,"");print $0"N"}'  Input_file

如果要对特定字段进行恶作剧,请尝试:(以第1个字段应在此处附加N为例)

awk '{gsub(/\r/,"");$1=$1"N"} 1'  Input_file

答案 1 :(得分:1)

您需要的是:

sed 's/\r*$/N/'

看:

$ cat -v file
Aa^M
Bb^M
C^M
Dd^M

$ sed 's/\r*$/N/' file | cat -v
AaN
BbN
CN
DdN

答案 2 :(得分:0)

没有-i选项来更改文件,请在gnu sed上尝试:

sed -E 's/$/N/' file