Я пишу сценарий Bash, и я хотел бы найти конечную позицию пробела в нескольких строках. Я не могу просто искать пробелы, потому что там могут быть вкладки. Ниже приведены несколько примеров строк, которые я мог бы найти.

11:tcp_listen         1.2.3.4:3478
12:tcp_listen              [::1]:3478
13:tcp_listen               [2600:2700:2800:2900:3000:3100:3200:3300]:3478
  • Первая строка: пробел Конечная позиция: 21
  • Вторая строка: пробел Конечная позиция: 26
  • Третья строка: пробел Конечная позиция: 24

Я перебираю каждую строку, и каждая строка является переменной.

Пример:

line="11:tcp_listen         1.2.3.4:3478"

1 ответ1

1

Попытка вставить смешанные пробелы и вкладки не удается на этой веб-странице, но:

$ line="11:tcp_listen         1.2.3.4:3478"
$ shopt -s extglob                                  # important!
$ prefix_with_spaces=${line%%+([^[:space:]])}
$ echo ">$prefix_with_spaces<"
>11:tcp_listen         <
$ echo ${#prefix_with_spaces}
22

Давайте попробуем это с реальными вкладками

$ line=$'11:tcp_listen\t\t1.2.3.4:3478'
$ prefix_with_spaces=${line%%+([^[:space:]])}
$ echo ${#prefix_with_spaces}
15

Я использую расширение параметров оболочки и расширенные шаблоны. Проверьте man-страницу для деталей.

Точно так же, если вы хотите получить текст, следующий за последним пробелом: та же техника, более простой шаблон:

$ line="11:tcp_listen         1.2.3.4:3478"
$ suffix=${line##*[[:space:]]}
$ echo ">$suffix<"
>1.2.3.4:3478<
$ line=$'11:tcp_listen\t\t1.2.3.4:3478'
$ suffix=${line##*[[:space:]]}
$ echo ">$suffix<"
>1.2.3.4:3478<

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .