Если вы можете предоставить Расширенные регулярные выражения до sed
(обычно с опцией -E
или -r
), то вы можете сократить выражение sed
до:
sed -E 's/(^|\s)-(\w)/\1\2/g;s/(\w)-(\s|$)/\1\2/g' file
Где базовая форма c - sed -E 's/find1/replace1/g;s/find2/replace2/g' file
, которая также может быть записана в виде отдельных выражений sed -E -e 's/find1/replace1/g' -e 's/find2/replace2/g'
(на ваш выбор).
Подробности s/find1/replace1/g
:
find1
is (^|\s)
найти и захватить в начале или пробеле, - , за которым следует
'-'
дефис, - и затем захватить следующий
\w
(слово-символ); и
replace1
просто \1\2
повторно вставьте оба захвата с первыми двумя обратными ссылками.
Следующее выражение подстановки аналогично, за исключением того, что вы сейчас ищем дефис с последующим пробелом или в конце. Итак, у вас есть:
find2
, являющийся - захватом
\w
(слово-символ), - с последующим дефисом,
- с последующим захватом либо следующего пробела, либо конца
(\s|$)
, затем
replace2
такой же, как и раньше, просто вставьте захваченные символы с помощью обратных ссылок.
В каждом случае g
обозначает глобальную замену всех вхождений.
( примечание: слово \w
также включает в себя '_'
(подчеркивание), поэтому маловероятно, что у вас будет дефис и подчеркивание вместе, но если вы это сделаете, вам нужно использовать список [A-Za-z]
вместо \w
)
Пример Use / Output
В вашем случае вывод:
$ sed -E 's/(^|\s)-(\w)/\1\2/g;s/(\w)-(\s|$)/\1\2/g' file
I AM EMPTY-HANDED AND I WA
ANT SOME COO COOKIES