向匹配的正则表达式添加后缀不起作用

向匹配的正则表达式添加后缀不起作用

这是我的号码列表:

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

相关内容