Bash:在^ M污染的字符串中附加文本

问题描述 投票:0回答:3

这个问题的重点转移了一点,真正的问题在下面的编辑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

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

sed carriage-return
3个回答
1
投票

如果你对awk没问题,你可以简单地使用print而不是替换。

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

如果你想为特定的领域副做,那么尝试:(举例说明第一个字段应该附加N这里):

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

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

0
投票

没有-i选项来获取文件更改,尝试使用gnu sed:

sed -E 's/$/N/' file
© www.soinside.com 2019 - 2024. All rights reserved.