В bash
, '...'
— сильные кавычки, поэтому с '\n'
литерал \n
передается awk
, а с '\\n'
— литерал \\n
. Там нет трансформации.
В awk
, внутри "..."
, \n
и \\
... расширены. Итак, при передаче "\n"
вgensub()
(или print
или что-либо вawk
)это фактический символ новой строки, а при передаче "\\"
это \
.
Теперь gensub()
также понимает свой первый аргумент как регулярное выражение, где \
также имеет особое значение, которое зависит от реализации.
Что согласуется между реализациями, так это то, что регулярное выражение \\
соответствует литералу \
точно так же, как \.
соответствует литералу .
. Однако для регулярного выражения \n
, соответствует ли оно символу новой строки или n
, зависит от реализации. В случае gawk
это соответствует новой строке. Таким образом, и gensub("\n", "x")
, и gensub("\\n", "x")
заменяют символы новой строки на x
, первый, потому что буквальный символ новой строки передается в gensub()
, второй, потому что \n
передается в gensub()
, который понимается как регулярное выражение который соответствует символу новой строки.
Обратите внимание, что спецификация POSIX имела несколько проблем, связанных с обработкой обратной косой черты в регулярных выражениях в awk
. Это будет исправлено в следующей версии спецификации. Подробности см. в http://austingroupbugs.net/view.php?id=1105.
Это становится еще более запутанным при использовании /\n/
вместо "\n"
.