Эквивалентная команда sed linux для AIX - PullRequest
0 голосов
/ 20 марта 2020

У меня есть такой тип данных:

xxxx aaaaaaaaaaaaaaaaaaa
xxxx bbbbbbbbbbbbbbbbbbb
xxxx ccccccccccccccccccc
xxxx ddddddddddddddddddd
xxxx eeeeeeeeeeeeeeeeeee

Я хочу этот вывод:

xxxx aaaaaaaaaaaaaaaaaaa
'' bbbbbbbbbbbbbbbbbbb
'' ccccccccccccccccccc
'' ddddddddddddddddddd
'' eeeeeeeeeeeeeeeeeee

Вкл. linux Я могу сделать:

sed "1 ! s|xxxx|''|" data.txt

Но когда я попробую это в AIX:

sed: 0602-403 1 ! s|xxx|''| is not a recognized function.

Не могли бы вы мне помочь?

Ответы [ 4 ]

1 голос
/ 20 марта 2020

Из спецификации POSIX для sed (выделение добавлено):

Перед функцией может стоять знак "!" символ, в этом случае функция должна применяться, если адреса не выбирают пространство шаблона. Ноль или более <blank> символов должны быть приняты до '!' персонаж. Не указано, могут ли символы <blank> следовать за '!' характер и соответствующие приложения не должны следовать за «!» персонаж с <blank> символами.

Я подозреваю, что вы столкнулись с этим. GNU sed допускает пробелы между, AIX sed, вероятно, нет.

Используйте взамен sed "1!s|xxxx|''|" data.txt, и я уверен, что это сработает.

Я думаю, что sed "2,$ s/xxxx/''/" data.txt предложил в комментарии все же понятнее.

1 голос
/ 20 марта 2020

Прошло много времени с тех пор, как я сделал какую-либо AIX.

Возможно, будет проще установить GNU sed для ваших систем AIX, особенно если вы думаете, что будете переносить Linux много шелл-кода.

Кроме того, может работать две команды sed, связанные с использованием оболочки, например:

sed -n "1p" < input
sed -n "2,$ s|xxxx|''|p" < input

Я не проверял это в системе AIX, заметьте, , Это всего лишь предположение.

0 голосов
/ 20 марта 2020

Вы можете сохранить первую строку, используя shell, и вызвать sed для остальных:

{ IFS= read -r firstline; printf "%s\n" "$firstline"; sed "s|xxxx|''|"; } <input
0 голосов
/ 20 марта 2020

Используйте awk:

$ awk -v q="''" 'NR>1{sub(/xxxx/, q)} 1' ip.txt
xxxx aaaaaaaaaaaaaaaaaaa
'' bbbbbbbbbbbbbbbbbbb
'' ccccccccccccccccccc
'' ddddddddddddddddddd
'' eeeeeeeeeeeeeeeeeee
  • -v q="''" создает переменную q со значением ''
  • NR>1, если номер строки больше 1
  • sub(/xxxx/, q) заменить xxxx содержимым переменной q для строки ввода
    • , если вам всегда нужно заменить все первое поле, вы можете использовать $1=q вместо sub здесь
  • 1 печать содержимого строки ввода, которая присутствует в специальной переменной $0
...