我正在尝试在文本中的任意位置用★替换_ _1或可能将_3_1替换为★。所以它可以是空格或下划线之间的数字,最后始终是数字。
到目前为止,我只能替换一个数字,每次尝试添加更多数字时,它将停止工作。
这是行不起作用:
sed -e 's/ [0-9] /★/g' |
更新后的完整代码:
echo
echo `cal` |
sed "s/$(date +%e) / $(date +%e | sed 's/.*/★/g') /" |
sed s'/Su Mo Tu We Th Fr Sa//g' |
sed s'/ */ \| /g' |
sed 's/_[ 0-9]_[0-9]/★/g'|
sed s'/^ \|//' | sed s'/ \|//' | sed s'/\|/: /' |
sed s'/\|//g' | sed s"/$/ /"
原始字符串来自“ cal” , 由于某种原因,在当日放置了_ _。如果是2月9日是_ _2,如果是30日是_3_0:
"September 2018 Su Mo Tu We Th Fr Sa _ _1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30"
我想要的输出 代替当前日期的星星。
"September 2018: ★ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30"
答案 0 :(得分:2)
您可以使用:
_[ 0-9]_[0-9]
正则表达式演示here。
$ echo "_ _1 _3_1" | sed 's/_[ 0-9]_[0-9]/★/g'
★ ★
根据更新:
$ echo "September 2018 Su Mo Tu We Th Fr Sa _ _1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30" | sed -r 's/ ([A-Za-z]{2} ){7}(_[ 0-9]_[0-9])/: ★/g'
September 2018: ★ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
正则表达式演示here。
答案 1 :(得分:2)
如果您用cal
检查od
的输出,您会看到应该用今天前的_
删除一些空格:
$ echo $(cal) | od -a
0000000 S e p t e m b e r sp 2 0 1 8 sp S
0000020 u sp M o sp T u sp W e sp T h sp F r
0000040 sp S a sp _ bs sp _ bs 1 sp 2 sp 3 sp 4
0000060 sp 5 sp 6 sp 7 sp 8 sp 9 sp 1 0 sp 1 1
0000100 sp 1 2 sp 1 3 sp 1 4 sp 1 5 sp 1 6 sp
0000120 1 7 sp 1 8 sp 1 9 sp 2 0 sp 2 1 sp 2
0000140 2 sp 2 3 sp 2 4 sp 2 5 sp 2 6 sp 2 7
0000160 sp 2 8 sp 2 9 sp 3 0 nl
今天是1
,您可以在上面的输出中看到序列_ bs sp _ bs 1
。
要用★
替换今天的日期,可以用awk
轻松地替换这5个字符和日期数字:
$ echo $(cal) | awk -v t=$(echo $(date +%e)) 'sub("_[\b] _[\b]"t,"★")'
September 2018 Su Mo Tu We Th Fr Sa ★ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
更容易地,您可以使用cal -h
来关闭当前日期的突出显示,然后执行以下操作:
$ echo $(cal -h) | awk -v t=$(echo $(date +%e)) 'sub(" " t " "," ★ ")'
September 2018 Su Mo Tu We Th Fr Sa ★ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
或者在这种情况下也使用sed
:
$ echo $(cal -h) | sed -E "s/ $(echo $(date +%e)) / ★ /"
September 2018 Su Mo Tu We Th Fr Sa ★ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
sed
在第一种情况下不如awk
容易使用,因为它缺乏对转义字符(如\b
(GNU sed除外)的一致支持。