Захват текста между n косыми чертами с использованием bash - PullRequest
0 голосов
/ 20 января 2020

У меня есть файл со списком URL. Я хотел бы захватить текст между косыми чертами N и N + 1 и поместить его в переменную.

Я также хотел бы удалить все после последней строки sh.

Пример: https://example.com/dir1/dir2/dir3/file.txt

  1. Захват текста между 2-й и 3-й косой чертой и выдача "example.com"
  2. Захват текста между 3-м и 4-м косая черта и результат "dir1"
  3. Захват текста между 4-й и 5-й косой чертой и выдача "dir2"
  4. И так далее ...
  5. Наконец, определите "файл". txt "как конец URL, удалите его и получите" https://example.com/dir1/dir2/dir3/

URL могут содержать различное количество слешей от 3 до 30.

Спасибо.

Ответы [ 5 ]

0 голосов
/ 21 января 2020

Если вы хотите извлечь указанное c поле, вы можете использовать cut

cut -f FIELD_NUM -d '/' <(echo "URL")

Пример:

cut -f 3 -d '/' <(echo "https://example.com/dir1/dir2/dir3/file.txt") => example.com

cut -f 5 -d '/' <(echo "https://example.com/dir1/dir2/dir3/file.txt") => dir2

0 голосов
/ 21 января 2020

awk имеет дело с полями . Рассматривайте свой разделитель как '/', а awk делает разделение тривиальным, например,

$ echo "https://example.com/dir1/dir2/dir3/file.txt" | 
awk -F/ '{for(i=1;i<=NF;i++) if(length($i)) print "field[" i "]: " $i}'
field[1]: https:
field[3]: example.com
field[4]: dir1
field[5]: dir2
field[6]: dir3
field[7]: file.txt

Поскольку внутренняя переменная awk NF автоматически предоставляет количество полей, не имеет значения, сколько слэшей вы иметь. С помощью команды length() вы можете просто пропустить пустое поле между '//'.

0 голосов
/ 21 января 2020

Вот как я это сделаю.

1. Захват текста между 2-й и 3-й косой чертой и выдача "example.com"

 url=https://example.com/dir1/dir2/dir3/file.txt
 url=${url%"${url#*http*.*/}"}
 url=${url%/*}
 echo "${url##*/}"
 example.com

2. Захват текста между 3-й и 4-й слэши и дают "dir1"

url=https://example.com/dir1/dir2/dir3/file.txt
url1=${url%"${url#*http*.*/}"}
url1=${url#*"${url1}"}
echo "${url1%%/*}"
dir1

3. Захват текста между 4-м и 5-м слэшем и выдают "dir2"

url=https://example.com/dir1/dir2/dir3/file.txt
url1=${url%"${url#*http*.*/}"}
url1=${url#*"${url1}"}
url1=${url1#*/}
echo "${url1%%/*}"
dir2

4 -----

5. Наконец, определите «file.txt» как конец URL, удалите его и получите https://example.com/dir1/dir2/dir3/

url=https://example.com/dir1/dir2/dir3/file.txt
echo "${url%/*}"
https://example.com/dir1/dir2/dir3/

По крайней мере, так я понял вопрос.

0 голосов
/ 21 января 2020

Не могли бы вы попробовать следующее:

while IFS= read -r line; do                     # read the input records line by line
    echo "${line%/*}/"                          # print the url removing the portion after the last slash
    IFS="/" read -ra ary <<< "$line"            # split the url on slashes and store the result in an array
    for ((i=2; i<${#ary[@]}; i++)); do          # iterate over the array from the 2nd elemnt to the last one
        printf "ary[%d]=%s\n" "$i" "${ary[i]}"  # print each element of the array
    done
    # do whatever here using the variables above
done << EOS
https://example.com/dir1/dir2/dir3/file.txt
http://foo.bar.com/dirA/dirB/dirC/dirD/baz.txt
EOS

Вывод:

https://example.com/dir1/dir2/dir3/
ary[2]=example.com
ary[3]=dir1
ary[4]=dir2
ary[5]=dir3
ary[6]=file.txt
http://foo.bar.com/dirA/dirB/dirC/dirD/
ary[2]=foo.bar.com
ary[3]=dirA
ary[4]=dirB
ary[5]=dirC
ary[6]=dirD
ary[7]=baz.txt

Конечно, вы можете кормить список URL-адресов из файла.
Надеюсь, это поможет.

0 голосов
/ 20 января 2020

Используйте функцию bash, позволяющую удалять префиксы и суффиксы из строки:

url="https://example.com/dir1/dir2/dir3/file.txt"
echo $url

https://example.com/dir1/dir2/dir3/file.txt

path=${url%/*}
echo $path

https://example.com/dir1/dir2/dir3

result=${path##*/}
echo $result

dir3

Нет необходимости l oop по пути.

Я не уверен, если ПО запрашивает $ path или $ result в качестве ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...