Можно ли выполнить grep из потока, в котором нет новой строки?

А как насчет этого, который работает как минимум на bash 3.x и выше:

astr=(a b c)
str=astr[@]              # Our reference to an array
local arr=("${!str}")    # Copy into an array using indirect ref
echo ${#arr[*]}
# 3

bstr=("a foo" "a bar" "a fox" "a buzz")
str=bstr[@]
local arr=("${!str}")
echo ${#arr[*]}
# 4

Мы используем ключевое слово local, чтобы наша рабочая переменная arrоставалась локальной для функции, но это необязательно. На самом деле, из-за ограничений bash, arrможно также использовать для доступа к элементам в косвенном )массиве (, например:

echo ${arr[1]}       # Print 2nd element
echo ${#arr[1]}      #... print its size

(Проверено на bash 3.1.23 , bash 4.3.48 и 4.4.12)

2
30.07.2019, 17:17
1 ответ

Grep в основном ищет строки, содержащие совпадения с заданным шаблоном. В зависимости от шаблона может быть невозможно определить, соответствует ли строка, не глядя на всю строку. С grep Matchэто возможно, а с grep 'Match$'— нет. С grep -o Matchgrep мог бы напечатать Match, как только увидит его, но с grep -E -o '(Match)+', если grep прочитал MatchMa, он не знает, последует tchили нет.

Grep не реализует особые случаи, когда можно было бы записать некоторый вывод до того, как будет видна вся строка. (Я думаю, что он не реализует какой-либо такой особый случай, но я не совсем уверен, :GNU grep имеет несколько режимов, зависящих от шаблона, которые ведут себя несколько по-разному. )Он просто читает целую строку перед попыткой сопоставления.

Если есть символ, который никогда не появляется в совпадающем тексте и всегда (или, по крайней мере, часто )появляется между совпадениями, преобразуйте этот символ в новую строку. (Или в нулевой байт и используйте grep -z.)

while true; do printf "Match Unmatch"; sleep 1s; done | stdbuf -o0 tr ' ' '\n' | grep -o "Match"

Обратите внимание на использование stdbuf -o0для предотвращения буферизации вывода tr. И если вы передаете вывод grep, вам понадобится это и для grep, или используйте grep --line-buffered.(--line-bufferedбуферизует вывод команды grep; это не влияет на то, как grep читает ввод, и по умолчанию включено, когда grep печатает на терминал.)

1
27.01.2020, 22:16

Теги

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