sed с переменной \ n сложностью - PullRequest
0 голосов
/ 23 июня 2019

Я добавляю содержимое переменной в строку. Видя этот странный результат. Можете ли вы объяснить, почему строчные n в содержимом обрабатываются как новая строка ... предложить альтернативный метод?

# CLNAM='NED2k'; echo 'order code is ' | sed "s/$/\\$CLNAM/";
order code is NED2k

# CLNAM='Ned2k'; echo 'order code is ' | sed "s/$/\\$CLNAM/";
order code is Ned2k

# CLNAM='ned2k'; echo 'order code is ' | sed "s/$/\\$CLNAM/";
order code is

ed2k

Первые два примера работают, давая желаемый результат в одну строку; третий пример приводит к двум строкам с пропущенной буквой 'n' - что-то интерпретирует это как разрыв строки.

Вышеуказанное упрощено только для иллюстрации проблемы. Я не использую echo, так что это не так просто, как просто вставить переменную прямо в команду echo;) Мой код представляет собой цикл по списку поддоменов; определите используемый сервер имен, затем найдите запись A и добавьте сервер имен к этому результату.

do dig @$NSTU $SUBD A |grep "^$SUBD.*IN.*A"| sed "s/$/\\$NSTU/"

Ожидаемый результат - AOK, когда NS в заглавных буквах, но те, которые не разбиваются на 2 строки и отбрасывают это начальное «n»

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Чтобы ответить на вопрос «почему», когда вы это сделаете:

sed "s/$/\\$CLNAM/"

с CLNAME=ned2k

Расширенная версия команды выглядит следующим образом:

sed "s/$/\ned2k/"

, что означает «для конца строки подставить новую строку и ed2k».

Причина этого в том, что вы избежали второй обратной косой черты, включив первую. Ни то, ни другое не было нужно. Возможно, вы хотели избежать знака доллара, но это не обязательно по двум причинам:

  1. Переменная оценивается в двойных кавычках, прежде чем результат будет передан в sed, который в результате никогда не увидит знак доллара
  2. В правой части замещающей функции sed знаки доллара являются буквальными (если предыдущее правило не было выполнено первым, например, если вместо двойных были одинарные кавычки)
0 голосов
/ 24 июня 2019

AWK поддерживает передачу переменных, которые могут вывести вас из кавычек:

dig @$NSTU $SUBD A |awk -v re="^$SUBD.*IN.*A" -v n="$NSTU" '$0~re {print $0, n}'
...