Shell脚本,替换为下划线+空格+可能的数字

时间:2018-09-01 12:46:50

标签: regex linux shell sed

我正在尝试在文本中的任意位置用★替换_ _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"/$/      /"

这是原始输出: Original output

这是我的代码之后的输出,下划线仍然存在: enter image description here

原始字符串来自“ 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"

2 个答案:

答案 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除外)的一致支持。