Почему я не получаю результат в grep, когда использую чередование вместо раскрытия скобок?

В этом случае используйтеcat:

var=$( cat somefile 2>/dev/null )

или сначала проверьте наличие файла:

if [ -f somefile ]; then
    var=$(<somefile)
fi

Во избежание состояния гонки в последнем примере (файл теоретически может исчезнуть между проверкой и чтением):

if cp somefile myname 2>/dev/null; then
    var=$(<myname)
    rm -f myname
fi

Следующее не будет работать:

var=$(<somefile) 2>/dev/null
var=$(<somefile 2>/dev/null)
1
27.12.2019, 00:06
2 ответа

Ваш первый пример:

Вы ищете символ верхнего регистра, за которым следует любое количество символов верхнего или нижнего регистра, повторяющихся от нуля до неограниченного количества раз. Однако ваше предложение содержит пробелы и знаки препинания('). Regex довольно мощный, но я не думаю, что это правильный инструмент для того, чего вы пытаетесь достичь. Во-первых, предложения могут заканчиваться всеми видами знаков препинания. Кроме того, на самом деле нет ограничений на количество символов, которые может содержать предложение.

I believe it was Stéphane that said you should always use `--` with rm!

Разве это не приговор?

Причина, по которой вам нужен пробел во втором примере, по той же причине, что и ваш первый пример не работает... в вашем предложении есть пробел.

Вы могли бы использовать что-то вроде этого:

[A-Z](\s|\S)+[.!?]

Однако это просто сопоставление всего, что начинается с прописной (английской )буквы и заканчивается пунктуацией, без реального учета чего-либо между ними.

Кроме того, как насчет следующего предложения?

iTunes is my least favorite music player.

0
28.04.2021, 23:26

В вашем выражении две "ошибки". Во-первых, вы не разрешаете сопоставлять '. Во-вторых, ([[:upper:]] | [[:lower:]])*будет соответствовать таким строкам, как A A   a a, то есть последовательности заглавных букв, за которыми следует пробел, или строчных букв, которым предшествует пробел.

Что нужно для сопоставления строки This doesn't work.,с явным соответствием прописной буквы Tи точки, а также что-то, что соответствует прописной, строчной, пробелу и 'в -между:

$ echo "This doesn't work." | grep -E "[[:upper:]]([[:upper:]]| |'|[[:lower:]])*\."
This doesn't work.

Это лучше записать как

$ echo "This doesn't work." | grep "[[:upper:]][[:upper:][:lower:]' ]*\."
This doesn't work.

(несмотря на то, что второй [:upper:]фактически не запускается тестовой строкой в ​​этом примере; мы могли бы использовать[[:upper:]][[:lower:]' ]*\.)

Пробел внутри выражения в квадратных скобках позволяет сопоставить фактический пробел в тексте. Без этого пробела шаблон не будет соответствовать (у вас есть два пробела в тестовой строке ). Именно поэтому я включаю туда символ ', потому что у вас, очевидно, есть тексты, которые вы хотите сопоставить, содержащие их.

2
28.04.2021, 23:26

Теги

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