私の番号のリストは次のとおりです。
46066.874.89
48569.123.56
56489.256.88
654.12.32
84689.25.69
私の目標は、最後に2つのゼロを追加することです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
代わりに、regexを使用して/...[0-9]\r$/
正規表現の一致を作成できます...[0-9]$/
。バラよりツール出力がそれ自体上書きされるのはなぜですか。どうすれば解決できますか? noredirect=1#comment97778025_45772525DOSラインエンディングに関する追加情報。
以下は、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