разделение строки в сценарии удара

Экран GNU является IMO лучшая благодарность до сих пор. Если экран GNU (или tmux) не доступен, выполните Вашего коллегу script -f.

И затем можно наблюдать то, что она делает путем выполнения tail -fn +0 /path/to/typescript.

1
26.11.2018, 00:36
3 ответа

@Jordanm уже дал Вам канонический ответ, который работает на любую строку. Если Вы имеете дело конкретно с путями, можно также использовать программы basename и dirname:

   basename - strip directory and suffix from filenames
   dirname - strip last component from file name

Например:

$ file="$HOME/Documents/test/one.txt"
$ dir=$(dirname "$file");
$ name=$(basename "$file");
$ echo "The file called $name is in the directory $dir"
The file called one.txt is in the directory /home/terdon/Documents/test
5
27.01.2020, 23:11

Это - общая задача, с которой может справиться расширение параметра в любой оболочке POSIX.

path=$HOME/Documents/test/one.txt
file=${path##*/} # file contains one.txt

Другая общепринятая методика должна использовать программу базового имени.

file=$(basename "$path")

Единственный недостаток должен породить внешнюю программу. Это - основное преимущество, то, что это правильно обрабатывает пути с запаздыванием /.

5
27.01.2020, 23:11
  • 1
    Быть педантичным, "$(basename "$path")" является неправильным в маловероятном случае, что $path концы с новой строкой. Это вызвано тем, что a) basename добавляют дополнительная новая строка на конце и b) $(command) полосы все запаздывающие новые строки. Заставить его работать требует извращенного обходного решения, чего-то вроде этого: path=$'/tmp/evil\n'; file="$(basename "$path"; printf x)"; strip=$'\nx'; fixed="${file%%$strip}" –  Matt 09.10.2013, 09:04

При выполнении этого с именами файлов используйте basename команда:

$ basename $HOME/Documents/test/one.txt
one.txt

Далее:

$ FILE=$(basename basename $HOME/Documents/test/one.txt)
$ echo $FILE
one.txt

Если необходимо разделить произвольные строки с произвольными разделителями, это - определенное волшебство. Считайте строку в массив и установите разделитель поля ввода на разделитель.

Вот пример:

$ IFS='/' read -a my_array <<< "$HOME/Documents/test/one.txt"
$ ARRAY_LENGTH=$(( ${#my_array[@]} - 1 ))
$ echo "${my_array[$ARRAY_LENGTH]}"
one.txt
1
27.01.2020, 23:11

Теги

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