Я знаю, что это старый вопрос, но я тоже искал его. Если вы загрузите prompinit (autoload -Uz promptinit && promptinit
), вы получите бесплатную опцию :$prompt_newline
, то есть $'\n%{\r%}'
.
В системе Debian исходный код можно найти в /usr/share/zsh/functions/Prompts/promptinit
и/илиhttps://github.com/zsh-users/zsh/blob/master/Functions/Prompts/promptinit
Кажется, вы хотите собрать все строки, соответствующие определенному шаблону, а затем напечатать их в конце.
Это можно сделать с помощью
awk '/^pattern/ { a[++n] = $0 }
END { for (i = 1; i <= n; ++i) print a[i] }' file
Это использует a
как массив и добавляет каждую строку, соответствующую шаблону, как новую запись в массиве. В конце цикл перебирает записи a
и печатает каждую.
Если вы хотите искать точную литеральную строку pattern
в первом столбце вместо сопоставления регулярного выражения со всей строкой, используйте $1 == "pattern"
в качестве условия.
Однако, если это все , которые вы хотите сделать, то проще просто использовать
awk '/^pattern/' file
или, если вы хотите сопоставить литеральную строку pattern
в первом столбце,
awk '$1 == "pattern"' file
Это вызовет действие по умолчанию для каждой строки, которая соответствует шаблону или содержит pattern
в качестве первого столбца, если вы используете второй вариант. «Действие по умолчанию» — напечатать строку.
В awk
, a += $0
будет арифметической операцией, которая увеличивает значение a
на текущую строку, интерпретируемую как число. Чтобы объединить строку как строку с переменной a
, вы должны использовать a = a $0
или a = a ORS $0
, если вы хотите вставить новую строку (значение по умолчаниюORS
)перед добавляемой строкой. Я полагаю, что ни то, ни другое вы не хотите здесь делать.
Если вы просто хотите напечатать все строки, первое поле которых pattern
, нет необходимости хранить данные в памяти, вы можете просто распечатать каждую строку по мере ее нахождения:
awk '$1=="pattern"' file
Или даже
grep -w '^pattern' file
Если вместо этоговы хотите напечатать каждую строку, если любое из полей строки равно pattern
, используйте:
awk '{ for(i=1; i<=NF; i++){ if($i=="pattern"){ print; next}}}' file
В качестве альтернативы, если вы просто ищете случаи, когда значение поля начинается с pattern
, но могут иметь другие символы после (, что и пытался сделать ваш код ), используйте это если вам нужно только первое поле:
awk '$1~/^pattern/' file
и это для любого поля:
awk '{ for(i=1; i<=NF; i++){ if($i~/^pattern/){ print; next}}}' file