这是我的号码列表:
46066.874.89
48569.123.56
56489.256.88
654.12.32
84689.25.69
我的目标是在 的末尾添加两个零654.12.32
。但由于某种原因两者都没有
sed -E 's/(\.[0-9][0-9])$/\100/' file
也不
sed -E 's/(\.[0-9][0-9]) *$/\100/' file
工作。我得到与输入完全相同的输出。有人知道这里会发生什么吗?
这基本上是我昨天的另一个问题的后续(为匹配的正则表达式添加后缀),但这有点偏离主题,因此提出了新问题。
编辑:当我使用时od -cb file
,这是我得到的输出:
0000000 4 6 0 6 6 . 8 7 4 . 8 9 \r \n 4 8
064 066 060 066 066 056 070 067 064 056 070 071 015 012 064 070
0000020 5 6 9 . 1 2 3 . 5 6 \r \n 5 6 4 8
065 066 071 056 061 062 063 056 065 066 015 012 065 066 064 070
0000040 9 . 2 5 6 . 8 8 \r \n 6 5 4 . 1 2
071 056 062 065 066 056 070 070 015 012 066 065 064 056 061 062
0000060 . 3 2 \r \n 8 4 6 8 9 . 2 5 . 6 9
056 063 062 015 012 070 064 066 070 071 056 062 065 056 066 071
0000100 \r \n
015 012
0000102
但我不知道如何解释这一点。如果回车被激活,那么如何解决这个问题呢?
答案1
它失败了,因为您试图[0-9]
在行尾匹配,但您的输入[0-9]
在任何行的末尾都没有,每行都以[0-9]\r
.您可以通过在正则表达式中使用/...[0-9]\r$/
而不是使正则表达式匹配...[0-9]$/
。看为什么我的工具输出会覆盖自身以及如何修复它?noredirect=1#comment97778025_45772525有关 DOS 行结尾的更多信息。
以下是如何处理仅 UNIX 行结束符、仅处理 DOS 行结束符以及两者:
$ printf '654.12.32\n' | cat -v
654.12.32
$ printf '654.12.32\r\n' | cat -v
654.12.32^M
$ printf '654.12.32\n' | sed -E 's/\.([0-9][0-9])$/\100/' | cat -v
654.123200
$ printf '654.12.32\r\n' | sed -E 's/\.([0-9][0-9])$/\100/' | cat -v
654.12.32^M
$ printf '654.12.32\r\n' | sed -E 's/\.([0-9][0-9])\r$/\100/' | cat -v
654.123200
$ printf '654.12.32\r\n' | sed -E 's/\.([0-9][0-9])(\r?)$/\100\2/' | cat -v
654.123200^M
$ printf '654.12.32\n' | sed -E 's/\.([0-9][0-9])(\r?)$/\100\2/' | cat -v
654.123200
答案2
如果我理解正确的话,这可能有效:
sed -E 's/^(.{3}\..{2}\..{2})$/\100/' file
输出:
46066.874.89
48569.123.56
56489.256.88
654.12.3200
84689.25.69
你的正则表达式不起作用,因为它匹配
46066.874.89 48569.123.56 56489.256.88 654.12.32 84689.25.69
所以输出是:
46066.874.8900
48569.123.5600
56489.256.8800
654.12.3200
84689.25.6900