Как поменять местами только числовые значения в каждой строке - PullRequest
2 голосов
/ 23 апреля 2019

Мне нужно поменять местами только числовые значения в каждой строке после конкретной строки "PIC", используя sed. Например:

hello PIC A(12), and this PIC B(11)

Желаемый вывод:

hello PIC B(11), and this PIC A(12)

Символы «B» и «A» могут отличаться в других строках, но всегда присутствует строка PIC.

Я пытаюсь использовать команду sed:

echo "hello PIC A(12), and this PIC B(11)" | sed '/PIC X(12)/s/PIC X(12)/PIC X(11)/g'

но, похоже, не работает должным образом.

Все ответы приветствуются.

Ответы [ 3 ]

2 голосов
/ 23 апреля 2019

Вы можете использовать команду substitute напрямую, поскольку она изменит только те строки, где найдено совпадение.

Используйте этот POSIX ERE

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

Или POSIX BRE

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

Две версии отличаются в скобках, которые экранируют: в POSIX BRE \(...\) обозначают группы захвата, а ( и ) соответствуют буквальным круглым скобкам, а в POSIX ERE - наоборот.

Детали шаблона POSIX ERE:

  • (PIC ) - группа 1: PIC и пробел
  • ([A-Z]\([0-9]+\)) - Группа 2: любая заглавная буква ASCII, (, 1+ цифр, )
  • (.*PIC ) - Группа 3: любые 0 или более символов, PIC, пробел
  • ([A-Z]\([0-9]+\)) - Группа 4: заглавная буква, (, 1+ цифр, ).
1 голос
/ 23 апреля 2019

С любым POSIX sed:

$ sed 's/\(PIC [[:upper:]]([0-9]*)\)\(.*\)\(PIC [[:upper:]]([0-9]*)\)/\3\2\1/' file
hello PIC B(11), and this PIC A(12)

Если у вас нет POSIX sed (например, старого sed в Solaris), тогда установите LC_ALL=C и измените [:upper:] на [A-Z].

1 голос
/ 23 апреля 2019

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

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