Если вас интересует только набор строк, вы можете просто использовать ассоциативный массив("хэш-карту"):
declare -A hm
hm[hello]=1
hm[world]=1
hm[hello]=1
if [ "${hm[hello]}" ] ; then... ; fi
Все, что вас волнует, это связано ли что-то с ключом или нет. Значение не имеет значения, нас интересует только наличие не -пустой строки (, поэтому вы можете «удалить» запись, установив для нее пустую строку ).
Это было бы аналогично использованию HashMap
для представления набора (, который на самом деле является тем, что делает HashSet в Java, фактически ).
Эти ассоциативные массивы доступны в Bash 4 и более поздних версиях, а также в zsh и ksh. Они не работают в версиях Bash серии 3 -и более ранних версиях, включая Bash 3.2 для macOS.
Эквивалента POSIX не существует. Вы можете имитировать эффект , используя eval
, если ваши строки соответствующим образом ограничены или имеют естественное преобразование в действительные имена переменных :
.
hm_hello=1
hm_world=1
key=test
eval "hm_$key=1"
if [ "$(eval hm_$key)" ] ; then... ; fi
Вы также можете использовать временный файл и grep
, например, или даже множество временных файлов и файловую систему в качестве хранилища ключей.
Также возможно (вероятно, )что использование какого-либо другого инструмента или языка более подходит, чем сценарий оболочки. Как минимум,awk
доступен во всех системах POSIX и поддерживает ассоциативные массивы с ключами -.
Если у вас действительно есть сложные данные, -структура нуждается в обычном языке общего -назначения, который может быть еще более подходящим. Perl и Python также широко доступны.
Предполагая, что вы показываете полную строку из некоторого входного файла:
sed "s/'.*/|/" file >newfile
Это заменит все после первого символа '
в каждой строке на символ |
. Результат будет записан в новый файл посредством перенаправления. Я использую двойные кавычки вокруг выражения sed
, поскольку строка в одинарных кавычках не может содержать символ одинарной кавычки.
Учитывая данные примера, это даст
SUBSCIBER_MSISDN=6289666195060|
Если вы дополнительно хотите удалить пробелы в начале строки (, ваш пример, похоже, делает это):
sed -e "s/'.*/|/" -e 's/^[[:blank:]]*//' file >newfile
или,
sed "s/'.*/|/; s/^[[:blank:]]*//" file >newfile
Если у вас есть отвращение к sed
, вы можете использовать awk
для точно такой же трансформации:
awk '{ sub("'"'"'.*", "|"); sub("^[[:blank:]]*", ""); print }' file >newfile
Причудливый вид '"'"'
— это одинарная кавычка. Он должен быть заключен в двойные кавычки за пределами строки в одинарных кавычках, которая составляет код awk
. Мы могли бы также использовать '\''
, т.е.
awk '{ sub("'\''.*", "|"); sub("^[[:blank:]]*", ""); print }' file >newfile
Или вы можете использовать восьмеричный код ASCII для символа одинарной кавычки:
awk '{ sub("\047.*", "|"); sub("^[[:blank:]]*", ""); print }' file >newfile