Сценарий оболочки, заменить подчеркивание + пробел + возможное число - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь заменить _ _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 сентября, то говорит _ _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 голосов
/ 01 сентября 2018

Если вы посмотрите на вывод 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).

0 голосов
/ 01 сентября 2018

Вы можете использовать:

_[ 0-9]_[0-9]

Regex demo здесь .

$ 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

Regex demo здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...