Удалите последнее поле - PullRequest
0 голосов
/ 12 июня 2019

Мой скрипт будет получать данные различной длины, и я хочу удалить последнее поле, разделенное символом "/". Пример ввода, с которым я буду иметь дело:

this/that/and/more

Но проблема, с которой я сталкиваюсь, заключается в том, что длина ввода будет меняться примерно так:

this/that/maybe/more/and/more
or/even/this/could/be/it/and/maybe/more
short/more

В любом случае ожидаемый результат должен быть всей строкой минус последняя "/more".

Примечание: Слово «больше» не будет константой, это произвольные примеры.

Пример ввода:

this/that/and/more
this/that/maybe/more/and/more

Ожидаемый результат:

this/that/and
this/that/maybe/more/and

То, что я знаю, работает для строки, длина которой, как вы знаете, будет

cut -d'/' -f[x]

Мне нужна команда AWK с разделителями '/', которую я принимаю как:

awk '{$NF=""; print $0}'

Ответы [ 5 ]

4 голосов
/ 12 июня 2019

При использовании awk в соответствии с запросом:

$ awk '{sub("/[^/]*$","")} 1' file
this/that/maybe/more/and
or/even/this/could/be/it/and/maybe
short

, но этот тип задания лучше всего подходит для:

$ sed 's:/[^/]*$::' file
this/that/maybe/more/and
or/even/this/could/be/it/and/maybe
short

Вышеуказанные операции выполнялись для этого входного файла:

$ cat file
this/that/maybe/more/and/more
or/even/this/could/be/it/and/maybe/more
short/more
2 голосов
/ 12 июня 2019

В зависимости от того, как у вас есть входные данные в вашем скрипте, расширение параметров оболочки bash может быть удобным:

$ s1=this/that/maybe/more/and/more
$ s2=or/even/this/could/be/it/and/maybe/more
$ s3=short/more

$ echo ${s1%/*}
this/that/maybe/more/and

$ echo ${s2%/*}
or/even/this/could/be/it/and/maybe

$ echo ${s3%/*}
short

(много дополнительной информации о расширении параметра на https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html)

0 голосов
/ 12 июня 2019

Вот альтернативное решение оболочки:

while read -r path; do dirname "$path"; done < file
0 голосов
/ 12 июня 2019

Другая awk альтернатива с использованием полей вместо регулярных выражений

awk -F/ '{printf "%s", $1; for (i=2; i<NF; i++) printf "/%s", $i; printf "\n"}'
0 голосов
/ 12 июня 2019

В вашем скрипте вы можете создать цикл, который удаляет последний символ во входной строке, если он не является косой чертой в каждой итерации.Затем, когда цикл находит символ косой черты, выйдите из цикла и удалите последний символ (который должен быть косой чертой).

Псевдокод:

while (lastCharacter != '/') {
    removeLastCharacter();
}
removeLastCharacter();    # removes the slash

(Извините,я давно не писал bash-скрипт.)

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