Допустим, у меня есть такие строки:
/somefolder/andsubfolder/my_first_text.txt
/somefolder/andsubfolder/my_second_text.txt
и я хочу создать цикл для эха
my_first_text
my_second_text
После некоторых исследований я обнаружил, что команда cut
не в состоянии сделать это. Я думаю, что awk
может быть вариантом, но я не до конца понимал, как заставить его работать должным образом в этом примере ... поэтому любая помощь будет очень признательна.
Я думаю, что самый простой способ - использовать строковые операторы . Например, если:
str="/somefolder/andsubfolder/my_first_text.txt"
, то вы можете использовать что-то вроде:
str=${str##*/}
echo ${str%.txt}
Но вы все равно можете использовать cut
с помощью rev
(см. man cut
и man rev
для получения дополнительной информации):
echo $str | rev | cut -d/ -f1 | cut -d. -f 2- | rev
И решение с использованием awk
:
echo $str | awk -F/ '{print $NF}' | awk -F. '{$NF=""}1'
Чтобы избежать использования каких-либо внешних программ, таких как cut или awk, вы можете сортировать или объединять операторы строки bash, например если str="/somefolder/andsubfolder"
, то
str="${str##*/}"; echo "${str%.txt}"
сначала удаляет начальный компонент пути (сопоставление самого длинного префикса */
), затем удаляет суффикс .txt
(сопоставление самого короткого суффикса *.txt
)
. можно также сделать
str="${str##*/}"; echo "${str%.*}"
, чтобы удалить любой суффикс .*
вместо просто .txt
Попробуйте этот сценарий оболочки
#!/bin/bash
abc=/somefolder/andsubfolder/my_first_text.txt
my_file=$(echo $abc | awk -F/ '{print $4}')
echo "$my_file"
, это наверняка поможет вам.