![awk и sed добавляют конец каждой связанной строки](https://rvso.com/image/1592566/awk%20%D0%B8%20sed%20%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D1%8F%D1%8E%D1%82%20%D0%BA%D0%BE%D0%BD%D0%B5%D1%86%20%D0%BA%D0%B0%D0%B6%D0%B4%D0%BE%D0%B9%20%D1%81%D0%B2%D1%8F%D0%B7%D0%B0%D0%BD%D0%BD%D0%BE%D0%B9%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8.png)
Я хочу сделать некоторые манипуляции строками, но застрял в обработке строк за строкой. Мой файл выглядит так:
10.10.10.10 ABtest
10.10.10.11 ABprod
Я хочу добавить строку в каждую строку в соответствии со строкой в конце строки.
Мой подход заключается в использовании awk для проверки строки ABtest
в конце строки, а затем в преобразовании из ABtest
в test
с помощью sed. После этого я хочу добавить вывод к каждой связанной строке.
Я хочу вывести следующее:
10.10.10.10 ABtest test
10.10.10.11 ABprod prod
решение1
Нет необходимости в обоих, sed
и awk
вы можете использовать один инструмент. Код, который достигает вашей цели, awk
может быть
awk '
/AB/ {
printf $0
gsub("^AB", "", $2)
printf " %s\n", $2
}
' <<EOT
10.10.10.10 ABtest
10.10.10.11 ABprod
EOT
/<expression>/
ищет регулярное выражение, и {<code>}
часть сообщает awk, что делать с этой записью. В этом конкретном случае функция gsub
заменяет все появления 'AB' во втором столбце — если вы хотите просто заменить первое появление, используйте sub()
, но что касается регулярного выражения, я думаю, вы можете использовать либо одно, либо другое с тем же результатом — и результат выводится впоследствии.
В вашем вопросе не ясно, есть ли какие-либо строки между теми, которые нужно редактировать, чтобы они были напечатаны без изменений. Если это так, вам нужно перейти к следующей записи после match-and-edit, например:
awk '
/AB/ { printf $0; gsub("^AB", "", $2); printf " $2\n"; next; }
{ print $0 }
' <<EOT
10.10.10.10 ABtest
10.10.10.11 ABprod
testtesttets
EOT
Может быть, вам следует создать еще более специфичный тест, используя if
. Я настоятельно рекомендую вам взглянуть на некоторые ресурсы awk (здесьилиздесьнапример)