sedを使用して先行ゼロを選択的に削除する方法

sedを使用して先行ゼロを選択的に削除する方法

0以下を使用してそれらの1つを交換/削除するにはどうすればよいですかsed

2001:0db8:03cd:0000:0000:ef45:0006:0123

次のようにしてください。

2001:db8:3cd:::ef45:6:123

:中央には4つずつ8つの分割があります。

4番目の部分は失うべきではありません。どの 0そして他のものはリーダーゼロを削除できます。

答え1

したがって、連続したsを削除したいが、0前にコロンがある場合にのみ可能です。

sed -e 's/:00*/:/g'

答え2

同様のアプローチが使用されますawk

awk '{gsub(/:0*/,":")}1' file
2001:db8:3cd:::ef45:6:123

答え3

最初の4桁以外のゼロを削除する方法にまだ興味がある場合は、次のようにします。

sed 'H;g;s/\(\n\([^:]*\)\)*0*/\2/g
' <<\IN
2001:0db8:03cd:0000:0000:ef0405:00060:0123
IN

出力

2001:db8:3cd:::ef45:6:123

さて、これはグローバルにゼロ個以上の改行文字シーケンスと一致し、その後にゼロ個以上の非コロン文字またはゼロ個以上のゼロが続きます。最初のシーケンスは2つのサブグループに分けられます。 1つはewlineを含み\n、もう1つは含まれません。そうするグループはですが\1、そうしないで置き換えるサブグループはです\2。したがって、重複した\n行は文字を削除します。シーケンスにない一致するゼロは次のとおりです。いいえまったく保存されていないので削除されました。

H改行文字は前の文字からのみ検索されます。スペースを保存するために、改行文字の後に行を追加します。\n(常に空の状態で開始)- then get - getパターンスペースを上書きして既存のスペースを上書きします。h

答え4

会議

sed -r '/^..../s/:0+/:/g'

大丈夫ですか? (Gilesは最初の4文字を変更せずに回答を改善しました。)

関連情報