Вопрос:
Я обрабатываю журналы, и они выводят n вместо строк новой строки.
Мне показалось, что я передам tail в awk и сделаю простую замену, однако я не могу убежать от новой строки в регулярном выражении. Здесь я демонстрирую свою проблему с cat вместо tail:
// test.txt JohnnDoe SaranConnor cat test.txt | awk -F’\n’ ‘{ print $1 «n» $2 }’
Требуемый вывод:
John Doe Sara Connor
Фактический выход:
JohnnDoe <- there is a newline here SaranConnor <- there is a newline here
Итак, похоже, что \n не соответствует n между первым и последним именем в test.txt, но вместо этого используется новая строка в конце каждой строки.
Похоже, что \n не является правильным способом экранирования в терминале справа? Этот способ экранирования работает нормально, например. Возвышенный текст:
Лучший ответ:
Как насчет этого?
$ cat file JohnnDoe SaranConnor $ awk ‘{gsub(/\n/,»n»)}1’ file John Doe Sara Connor Ответ №1
Это будет работать с любым sed в любой системе, так как это переносимый способ использования новых строк в sed:
$ sed ‘s/\n/ /’ file John Doe Sara Connor
Если вы можете ввести строку типа foo\nbar, а \ – это экранированная обратная косая черта, вы не сможете использовать простой подстановочный подход, как вы просили.
Ответ №2
Использование GNU sed, решение довольно просто, поскольку уже был дан ответ на вопрос @hek2mgl (и что IMHO – это то, как он должен работать повсюду, но, к сожалению, этого не делает).
Но это немного сложно, когда делаете это на Mac OS X и других * BSD UNIXes.
Лучший способ выглядит следующим образом:
sed ‘s/\n/’$’n»/g’ <<< ‘ABCn123’
Тогда, конечно, все еще AWK, @AvinashRaj имеет правильный ответ, если вы хотите его использовать.
Ответ №3
Зачем использовать для этого awk или sed? Используйте perl!
perl -pe ‘s/\n/n/g’ file
Используя perl, вы избегаете думать о соблюдении posix, и он обычно дает лучшую производительность, и он будет согласован на всех (большинстве) платформах.
Ответ №4
Я бы использовал sed:
sed ‘s/\n/n/g’ file