Уникнення цитат у псевдонімі 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, це найкращий варіант?


До речі, це стосується всіх оболонок (у стилі Борна, а не csh).
Жил "ТАК - перестань бути злим"

Відповіді:


9

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

striplines() {
    awk '... awk body "with quotes" ...' "$@"
}

І тоді як би я це назвав striplines filename:?
Seamus

Ви могли б пояснити, що "$@"робить?
Сеамус

@Seamus, так, ви б назвали це саме так. "$@"Синтаксис відправляє смужки аргументи AWK ненарушенного - необхідно , якщо, скажімо, якісь - небудь з ваших імен файлів містять пробілу: striplines "file 1" "file 2"буде відправлено два імені в AWK.
glenn jackman

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);}'\'

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.