Почему echo of awk в сценарии bash удаляет разрывы строк? [дубликат]

Я не думаю, что это возможно, но, если вы хотите построить свой собственный хтоп, это возможно. Код находится на github, и если вы посмотрите на Meter.c, вы увидите логику, которую они используют, чтобы решить, что отображать.

0
31.08.2016, 08:13
3 ответа
​​

Не awk, эхо удалено. Оставьте echo , просто awk :

awk -F, '{ print $1 }' $1
1
28.01.2020, 02:14

Это не awk , это то, как оболочка расширяет вещи.

Возьмем пример:

$ a="1
> 2
> 3
> 4"

Итак, мы создали переменную на 4 строки. Но ...

$ echo $a
1 2 3 4

Так почему это только в одной строке?

$ echo "$a"
1
2
3
4

Ах, это не так!

Итак, есть что-то магическое вокруг echo $ a .

Мы можем увидеть похожую магию с пробелами:

$ a="1    2    3    4"
$ echo $a
1 2 3 4
$ echo "$a"
1    2    3    4

На самом деле это не echo , которое творит здесь магию; это оболочка. Без оболочки "..." оболочка попытается расширить переменную. Таким образом, глобусы будут расширены:

$ ls
a  file

$ a="*"
$ echo $a
a file
$ echo "$a"
*

Таким же образом оболочка принимает ваш вывод с возвратами в них, расширяет их, а затем возвращает в качестве параметров; возврат теряется.

Подводя итог ... если вы хотите защитить от подобного расширения, используйте "..." .

Однако в вашем коротком примере вам вообще не требуется echo . Просто позвоните напрямую awk .

4
28.01.2020, 02:14

Обратите внимание на разницу в выводе между этими двумя командами:

$ echo `awk -F, '{ print $1 }' $1`
1 2 3 4
$ echo "`awk -F, '{ print $1 }' $1`"
1
2
3
4

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

Документация

Из man bash :

Разделение слов

Оболочка сканирует результаты раскрытия параметров, подстановки команды и арифметического раскрытия, которых не было в двойные кавычки для разделения слов.

Оболочка обрабатывает каждый символ IFS как разделитель и разбивает результаты других расширений на слова, используя эти символы в качестве разделителей полей . Если IFS не задан или его значение точно равно <пробел> , значение по умолчанию, тогда последовательности , , и в начале и в конце результатов предыдущих расширений игнорируются, и любая последовательность символов IFS не в начало или конец служат для разделения слов.Если IFS имеет значение, отличное от значения по умолчанию, , то последовательности пробелов пробела и табуляции игнорируются в начале и конце слова, пока пробел символ находится в значении IFS (символ пробела IFS ). Любой символ в IFS, который не является пробелом IFS, вдоль с любыми соседними символами пробела IFS, ограничивает поле. Последовательность пробельных символов IFS также рассматривается как разделитель. Если значение IFS равно нулю, разбиение слов не происходит.

Явные нулевые аргументы ("" или '') сохраняются. Не заключенные в кавычки неявные нулевые аргументы, являющиеся результатом раскрытия параметров, не имеющих значений, удаляются. Если параметр без значения раскрывается в двойных кавычках, результатом является пустой аргумент, который сохраняется.

Обратите внимание, что если раскрытие не происходит, разделение не выполняется.

2
28.01.2020, 02:14

Теги

Похожие вопросы