Удалить соседние повторяющиеся слова из строки

Вы можете настроить стиль курсора в соответствии с режимом, установив его в.inputrc:

set editing-mode vi
set show-mode-in-prompt on
set vi-ins-mode-string \1\e[6 q\2
set vi-cmd-mode-string \1\e[2 q\2

# optionally:
# switch to block cursor before executing a command
set keymap vi-insert
RETURN: "\e\n"

Это даст вам лучевой курсор в режиме вставки или блочный курсор в обычном режиме.

Подробнее см.https://stackoverflow.com/a/42107711/52817

0
06.09.2021, 14:27
2 ответа
echo "one one tow tow three three tow one three" | tr " " "\n" | uniq | tr "\n" " "
0
07.09.2021, 10:23

Также можно использовать sed (GNU для +и\<)и использовать синтаксис -E, чтобы упростить регулярное выражение.

Это регулярное выражение удаляет одно повторяющееся слово (из двух принятых):

$ string='one one tow tow three three tow one three'
$ echo "$string" |
    sed -E 's/(\<([^ ]+)[ ]+)\2/\1/g' 

one  tow  three  tow one three

Но мы можем расширить эту идею и удалить любое количество повторений

$ string='one one tow   tow     tow     tow three three tow one one onebook one three three'

$ echo "$string" | 
    sed -E 's/(\<([^ ]+)[ ]+)(\2([ ]+|$))+/\1/g'

one tow   three tow none one onebook three

Или немного более сложное регулярное выражение BRE (, которое принимает пробел и табуляцию):

$ echo "$string" | 
    sed  's/\(\<\([^[:blank:]]\{1,\}\)[[:blank:]]\{1,\}\)\(\2\([[:blank:]]\{1,\}\|$\)\)\{1,\}/\1/g'

one tow   three tow none one onebook three

Примечание. :Поскольку sed является линейно-ориентированным инструментом, он будет работать только с одной строкой за раз.

2
06.09.2021, 19:27

Теги

Похожие вопросы