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在“天”的一部分?我需要以下日期格式:YYYYMM DD。

Answers:


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

您能解释一下这是如何工作的吗?这是我第一次查看该\<[0-9]\>结构,我认为该结构负责匹配单个数字,但不确定该结构被称为什么。谢谢。
佐助

2
\ <表示:'单词'的开头... [0-9]表示从0到9的一位数字... \>表示:'单词'的结尾...单词:用空格分隔的标记(或分别在行的开始/结束处开始/结束,分别用于\ <和\>)... PS。我只是试过标点符号..它们也是定界符。
Peter.O 2011年

1
你也可以做到这一点没有捕获括号:&在替换字符串将使用匹配LHS -sed 's/\<[0-9]\>/0&/'
格伦·杰克曼

哦,没有意识到这<>是Shell regex语法中的单词边界。想一想,即使是sed's / \ b [0-9] \ b / 0&/也可以。谢谢你俩。:)
佐助

@sasuke:<>扩展正则表达式(不是外壳程序)的功能……取决于您使用的版本和选项,sed并且shell都可以使用 扩展正则表达式或标准正则表达式……标准正则表达式使用\<\>
Peter。 Ø


2

这是使用带有扩展正则表达式的bash的(非固定方法)。 此方法允许范围对单个行进行更复杂的处理。(即不仅仅是正则表达式替换)

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系统上做同样的事情。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.