Выход из кавычек в псевдониме zsh

12

Исходя из этого вопроса об удалении строк из текста, я хочу превратить это в псевдоним zsh следующим образом:

alias striplines=' awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"'

Я пытался экранировать кавычки внутри скрипта awk, но я получаю эту ошибку:

awk: (FILENAME=bspsrobustness FNR=1) fatal: division by zero attempted

(Файл называется bspsrobustness)

Есть ли способ сделать то, что я хочу? Я полагаю, я мог бы превратить это в сценарий awk, а не в псевдоним zsh, это мой лучший вариант?

Симус
источник
Кстати, это относится ко всем оболочкам (в стиле Bourne, а не csh).
Жиль "ТАК - перестань быть злым"

Ответы:

9

Вы можете использовать функцию zsh вместо псевдонима. Нет цитирования обручи, чтобы прыгать.

striplines() {
    awk '... awk body "with quotes" ...' "$@"
}
Гленн Джекман
источник
И как тогда это назвать striplines filename?
Симус
не могли бы вы объяснить, что "$@"делает?
Симус
@ Симус, да, ты бы назвал это именно так. "$@"Синтаксис отправляет полоски аргументы AWK ненарушенного - необходимо , если, скажем, какие - либо из ваших имен файлов содержат пробела: striplines "file 1" "file 2"будет отправлено два имени в AWK.
Гленн Джекман
5

Чтобы понять, что происходит, запустите

% alias striplines='print -lr awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"'
% striplines
awk
 /^$/ {print "\n"; } /./ {printf( " %s ",zsh);}

Поскольку $символы заключены в двойные кавычки (когда они раскрываются после раскрытия псевдонима), они интерпретируются оболочкой. Чтобы получить правильное цитирование, проще поместить все определение псевдонима в одинарные кавычки. Внутри одинарных кавычек есть то, что будет раскрыто при использовании псевдонима. Теперь, когда аргумент awkобернут в двойные кавычки, ясно, что вам нужно использовать обратную косую черту \"$.

alias striplines='print -lr awk " /^\$/ {print \"\n\"; } /./ {printf( \" %s \",\$0);}"'

Полезная идиома для одинарных кавычек в строке в одинарных кавычках заключается в том, что '\''это в значительной степени способ поместить буквальную одинарную кавычку в строку в одинарных кавычках. Технически существует сопоставление строки в одинарных кавычках, обратной косой черты 'и другой строки в одинарных кавычках. Сопоставленная пустая строка ''в конце может быть удалена.

alias striplines='print -lr awk '\'' /^$/ {print "\n"; } /./ {printf( " %s ",$0);}'\'

После этого длинного объяснения, рекомендация: когда это слишком сложно для псевдонима, используйте функцию .

Жиль "ТАК - перестань быть злым"
источник