Как извлечь строки между n-м и m-м появлением определенного символа в linux bash? - PullRequest
0 голосов
/ 05 февраля 2020

Файл1 содержит:

a:b:c:d:any words here:e:f:G

w / r "любые слова здесь" могут быть одним словом, двумя словами, тремя словами и т. Д.

Я хочу получить Строка между 4-м ":" и 5-м ":". Таким образом, это будут «любые слова здесь».

Моя первоначальная идея состояла в том, чтобы заменить «:» на пробел, затем использовать awk для печати ... но поскольку строка, которую я хочу извлечь, может состоять из нескольких слов не будет точно работать.

Ответы [ 3 ]

2 голосов
/ 05 февраля 2020

С awk

$ echo 'a:b:c:d:any words here:e:f:G' | awk -F: '{print $5}'
any words here

Или путем создания массива с IFS, измененным на :

$ IFS=: words=( $(echo 'a:b:c:d:any words here:e:f:G') ); echo ${words[4]}
any words here
2 голосов
/ 05 февраля 2020
Команда

cut позволяет вам разбить строку на основе разделителя и извлечь из нее необходимые поля

В вашем примере

> echo 'a:b:c:d:any words here:e:f:G' |cut -f 5 -d:

должно дать вам

any words here
0 голосов
/ 05 февраля 2020

Если это только 1 строчный ввод, вы можете использовать регулярное выражение bash. Если вы хотите вернуть более 1 поля, это будет более болезненно, но для 1 поля это достаточно просто:

f=3
[[ "1:2:3:4:5:6:7:8" =~ (^([^:]*:){$f,$f})([^:]*)(:|$) ]]
echo "${BASH_REMATCH[3]}"
4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...