Как удалить текст перед разделителем?

Если вас интересует только набор строк, вы можете просто использовать ассоциативный массив("хэш-карту"):

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 также широко доступны.

0
07.03.2020, 13:24
1 ответ

Предполагая, что вы показываете полную строку из некоторого входного файла:

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
2
28.04.2021, 23:21

Теги

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