sedで2桁までゼロで埋める


19

入力:

201103 1 /mnt/hdd/PUB/SOMETHING
201102 7 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 3 /mnt/hdd/PUB/SOMET HING
201106 1 /mnt/hdd/PUB/SOMETHI NG

望ましい出力:

201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG

0たとえば1、「日」の部分に1桁しかない場合は、どうすれば追加できますか?この日付形式が必要です:YYYYMM DD。

回答:


13
$ sed 's/\<[0-9]\>/0&/' ./infile
201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG

これがどのように機能するか説明できますか?これは、1 \<[0-9]\>桁の数字を照合する責任があると思うが、このコンストラクトの名前がわからないコンストラクトを見るのは初めてです。ありがとう。
サスケ

2
\ <意味:「単語」の始まり... [0-9]は0〜9の1桁を意味します... \>意味:「単語」の終わり...単語:空白で区切られたトークン(または、\ <および\>の場合、それぞれ行の開始/終了で開始/終了します)... PS。句読点を試してみました。それらは区切り文字でもあります。
Peter.O

1
括弧をキャプチャせずにこれを行うこともできます。&置換文字列では、一致したLHSが使用されますsed 's/\<[0-9]\>/0&/'
glenn jackman

ああ、それ<>がシェル正規表現構文の単語境界であることを知らなかった。考えてみると、 `sed 's / \ b [0-9] \ b / 0&/'でも動作します。あなたがた両方に感謝します。:)
サスケ

@sasuke:<>拡張正規表現(シェルではない)の機能です...使用するバージョンとオプションに応じてsedshell両方が拡張正規表現または標準正規表現のいずれかを使用でき ます...標準正規表現の使用\<\>
Peter。 O


2

ここで使用する(非SED)の方法であるバッシュ拡張正規表現 ..
、この方法の範囲は、個々のラインのより複雑な処理を行うことを可能にします。(つまり、正規表現の置換以上のもの)

while IFS= read -r line ; do
    if [[ "$line" =~ ^(.+\ )([0-9]\ .+)$ ]]  
    then echo "${BASH_REMATCH[1]}0${BASH_REMATCH[2]}" 
    else echo "$line"
    fi
done <<EOF
201103 1 /mnt/hdd/PUB/SOMETHING
201102 7 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 3 /mnt/hdd/PUB/SOMET HING
201106 1 /mnt/hdd/PUB/SOMETHI NG
EOF

出力:

201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG

1

私はこのようなことをします:

sed -E 's/ ([0-9]) / 0\1 /' ./input

これは、孤独な数字を取得し、グループ' ([0-9]) 'で空白を取り除き、0と空白のパディングでそれらを元に戻します' 0\1 '

この-Eオプションを使用すると、OSXで最新のRegEx式を使用できる"\"ため(それほど頻繁に使用する必要はありません)、-rテストしたLinuxシステムでも同じことができます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.