Как удвоить все слова латинских букв в строке с помощью sed? - PullRequest
0 голосов
/ 14 октября 2018

Я пытался удвоить все латинские слова в строке, на самом деле нам также нужно заключить его в скобки.("lol" -> "(lollol)") "Слово" здесь означает последовательность латинских букв ( [A-Za-z] \ + ).Я много пробовал, например:

1) ls -l / bin |sed "s / [^] [A-Za-z] [^] / (&&) / g" , но он удваивает все символы, даже со специальными символами и цифрами

2) Также у меня есть идея взять все неподходящие слова в '|'скобки:
( ls -l / bin | sed "s / [^] [^ A-Za-z] [^] / | & | / g" )а затем удвоить все слова без скобок (еще не подумав, как) и удалите '|'скобки.Я понимаю, что неэффективно использовать 3 команды sed и что там может быть '|'символ в последовательности (хотя я знаю, как решить эту проблему).

Итак, после нескольких дней борьбы я решил воспользоваться помощью.

Вот несколько примеров:

1) "rwx" -> "(rwxrwx)"

2) "-rwx" -> "-rwx"

3) "jk2l" -> "jk2l"

4) "jkl" -> "(jkljkl) "

Теперь примеры строк:

1)" Я хочу 2 sh-w "->" (II) (wantwant) 2 sh-w "

2)"-rwx but th1-s" -> "-rwx (butbut) th1-s"

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Это может сработать для вас (GNU sed):

sed -r ':a;s/(^|\s)([[:alpha:]]+)(\s|$)/\1(\2\2)\3/g;ta' file

Соответствует словам, которые содержат только буквы, и заменяет их в желаемом стиле, затем повторяет совпадение, чтобы подобрать пропущенныесовпадения в первом проходе.

0 голосов
/ 15 октября 2018

Я собираюсь предложить awk для этой задачи:

$ cat file
rwx
-rwx
jk2l
jkl
I want 2 sh-w
-rwx but th1-s

$ awk '{ for (i=1; i<=NF; ++i) if ($i ~ /^[A-Za-z]+$/) $i = "(" $i $i ")" }1' file
(rwxrwx)
-rwx
jk2l
(jkljkl)
(II) (wantwant) 2 sh-w
-rwx (butbut) th1-s
...