Меняем местами слова и числа, встречающиеся в одной строке, используя SED - PullRequest
2 голосов
/ 26 апреля 2019

У меня есть большой файл, где в каждой строке он показывает:

OCCUPY 12 EVERY PIC 32(12) 
OCCUPY 45 EVERY PIC X(21) 
OCCUPY 98 EVERY PIC F(A0)
OCCUPY 21 EVERY PIC T(BC)

И желаемый результат должен быть:

PIC 32(12) OCCUPY 12 EVERY 
PIC X(21) OCCUPY 45 EVERY
PIC F(A0) OCCUPY 98 EVERY

и т. Д.

Итак, это только пример, но в файле есть много строк с разными символами / числами около PIC и разными числами около OCCUPY.

До сих пор я пытался выполнить:

sed -E 's/(.*OCCUPY\ )(0([A-Z]\([0-9])\)(.*EVERY\ )(.*PIC\ )(([0-9]\([0-9]+\))/\3\4\1\2/'
sed -E 's/((OCCUPY )([A-Z]\([0-9]))\)(.*EVERY )(.*PIC)(([0-9]\([0-9]))/\3\4\1\2/'

Но это не помогло.

Буду признателен за любую помощь!

Ответы [ 2 ]

5 голосов
/ 26 апреля 2019

Судя по вашему примеру, ваша команда sed кажется слишком сложной.А как насчет этой более простой версии?

sed 's/\(.*\) \(PIC .*\)/\2 \1/'

[обновление] Ваши строки сложнее, чем указано в вашем сообщении.Они похожи на:

MS-MSG OCCUPY 12 EVERY PIC 32(12) 0012345

И вы хотите:

PIC 32(12) OCCUPY 12 EVERY

Затем все, что вам нужно сделать, это добавить эти дополнительные символы в левую часть команды подстановки, но вне скобок (содержимое которых используется для построения новой строки):

sed 's/.* \(OCCUPY .*\) \(PIC [^ ]*\).*/\2 \1/'
1 голос
/ 26 апреля 2019

если ваши данные в файле d, попробуйте на GNU SED:

sed -E 's/^(OCCUPY.+EVERY).+(PIC \S+)/\2 \1/' d 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...