Удалить элементы из массива, не содержащие определенного символа

makeдовольно надежно доступен. Если вы распространяете свой проект с makefile, пользователи будут иметь простую справку о том, как выполнять задачи так же, как и вы. makefileможет использоваться не только для компиляции.

Возьмем, к примеру, проект, который не требует компиляции. Я помню, как работал над проектом Python, в котором была команда make для очистки всех файлов .pyc, команда make для запуска тестов, команда для загрузки копии статических данных с сервера разработки и т. д.

0
16.07.2020, 17:41
3 ответа

Тогда вы, вероятно, захотите сделать что-то подобное:

c_arr=$(echo $(grep -i "${alias}\." $output_file))

Потому что, как упомянул Билл Джетцер, в регулярном выражении нужно избегать точки.

Если вы уверены, что все с точкой верно, вы можете даже сделать:

c_arr=$(echo $(grep -i \. $output_file))

1
18.03.2021, 23:19

.— это оператор регулярного выражения, который соответствует любому одиночному символу.

Вот вам бы:

readarray -t c_arr < <(LC_ALL=C grep -iPo "\b\Q$alias\E\.\w+")

(предполагая, что $aliasне содержит \Eи ваш grepподдерживает -P(, он уже поддерживает -o, который является расширением GNU, поэтому, вероятно, он также будет поддерживать -P)).

1
18.03.2021, 23:19

В частности, отвечая на вопрос «Как удалить элементы, не содержащие определенного символа, из массива Bash». По структуре он очень похож на ответ Стефана Шазеласа. Если у вас есть массив и вы хотите его сократить, вы можете сделать это, как показано ниже:

$ list=(cab.row_id cab.name cabxa cabxa cab.x_sys_name)
$ printf "%s\n" ${list[@]}
cab.row_id
cab.name
cabxa
cabxa
cab.x_sys_name

$ # vvvv THIS ANSWERS THE QUESTION vvvv
$ IFS=$'\n' readarray -t list < <(printf "%s\n" ${list[@]} | grep '\.')
$ # ^^^^ THIS ANSWERS THE QUESTION ^^^^

$ printf "%s\n" ${list[@]}
cab.row_id
cab.name
cab.x_sys_name

Это предполагает, что ни один элемент не содержит \n, поэтому его можно использовать в качестве разделителя.

Немного по касательной :Вы можете использовать unsetдля удаления определенных элементов из массива, и это заставит Bash пропустить этот элемент при переборе элементов, но это не заставит все последующие элементы сместить значение индекса массива.:

$ list=(idx0 idx1 idx2 idx3 idx4)
$ printf "%s\n" ${list[@]}
idx0
idx1
idx2
idx3
idx4

$ unset list[2]
$ printf "%s\n" ${list[@]}
idx0
idx1
idx3
idx4

$ for x in ${list[@]}; do echo $x; done
idx0
idx1
idx3
idx4

$ for i in $(seq 0 4); do echo "$i: ${list[$i]}"; done
0: idx0
1: idx1
2: 
3: idx3
4: idx4
1
18.03.2021, 23:19

Теги

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