Одним из решений является удаление даты с конца с помощью cut
. Такой подход привел бы к:
JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n 's/.* version "([^.-]*).*"/\1/p' | cut -d' ' -f1)
Этот подход разбивается на символ пробела (-d' ' )и берет первое поле. Основываясь на вводе, это приведет к удалению добавленной даты openjdk.
Один из подходов к этой проблеме состоит в том, чтобы экранировать все символы регулярных выражений в файле1. и на следующем шаге ограничьте строку с обоих концов. Обратите внимание, что порядок шагов — имп.
Это можно назвать hybrid regex
подходом, при котором в фактической строке, которая должна быть сопоставлена, все ее символы регулярного выражения BRE удаляются, так что она становится литеральной строкой, в то время как на периферии мы размещаем символы регулярного выражения, чтобы ограничить совпадение как первое поле.
$ < file1 \
sed -e '
s:[[\.*^$]:\\&:g
s/.*/^&[[:blank:]]/
' | grep -f - file2
*Шаг -1 => визуализировать строку в файле1 как чистую строку по сравнению с -и -по отношению к grep с использованием выражений BRE.
*Шаг -2 => ограничить приведенную выше экранированную строку слева началом строки и справа пустым символом.
grep
с -E
. Вы можете использовать приведенную ниже команду awk
awk 'NR==FNR{a[$1];next}($1 in a){print $0}' file1 file2