Перемещение подстрок внутри строки - PullRequest
0 голосов
/ 23 ноября 2018

Допустим, длинная строка содержит несколько полей информации (подстрок), каждое из которых заключено в квадратные скобки.Несколько символов, предшествующих каждому из этих полей, являются символом двоеточия.

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

$echo "foo: bar [baz] qux: quux [quix]" | sought_command
foo[baz]: bar qux[quix]: quux

Я считаю, что только awk достаточно мощный, чтобы достичь этого, но, возможно, sed может сделать это тоже.

Примечание :

Вот первая попытка с использованием sed :

echo "foo: bar [baz] qux: quux [quix]" | sed 's/\[*]\/\:\1\2/g'

Вот первая попытка с использованием awk :

echo "foo: bar [baz] qux: quux [quix]" | awk -v 'RS=\]' '{print substr($1,1,length($1)-1) $3 "]: " $2}'

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

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

sed -r 's/:([^[]*)([^]]*\]) ?/\2:\1/g' file

Совпадение с образцом на символах, следующих за :, и перестановка обратных ссылок.

То же решение без синтаксическогосахар варианта -r:

sed 's/:\([^[]*\)\([^]]*\]\) \?/\2:\1/g' file
0 голосов
/ 23 ноября 2018

sed:

sed 's|\([^ :]*\):\([^:[]*\)\(\[[^]]*\]\)|\1\3:\2|g'

По сути, это создает 3 группы:

  1. \([^ :]*\): все, что не содержит двоеточия и заканчивается двоеточием
  2. \([^:[]*\) все, что не содержит двоеточия и открытой скобки.Заметьте, вы должны написать двоеточие перед левой квадратной скобкой, так как [:] имеет неопределенное значение в sed.
  3. \(\[[^]]*\]\) что угодно, заключенное в квадратные скобки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...