В этом случае используйте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)
Ваш первый пример:
Вы ищете символ верхнего регистра, за которым следует любое количество символов верхнего или нижнего регистра, повторяющихся от нуля до неограниченного количества раз. Однако ваше предложение содержит пробелы и знаки препинания('
). 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.
В вашем выражении две "ошибки". Во-первых, вы не разрешаете сопоставлять '
. Во-вторых, ([[: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:]' ]*\.
)
Пробел внутри выражения в квадратных скобках позволяет сопоставить фактический пробел в тексте. Без этого пробела шаблон не будет соответствовать (у вас есть два пробела в тестовой строке ). Именно поэтому я включаю туда символ '
, потому что у вас, очевидно, есть тексты, которые вы хотите сопоставить, содержащие их.