Ответы:
Пример мог бы быть полезным, но если я вас правильно понял, это сработало бы:
echo "Hello: world" | cut -f1 -d":"
Это преобразует "привет: мир" в "привет".
basenameи cut, см. Ответ Денниса ниже
cutМожно читать со стандартного ввода, поэтому лучше, особенно если у вас есть очень длинная строка, которую нужно обработать, например, содержимое файла.
hello: world. Это половина ответа.
В Bash (и ksh, zsh, dash и т. Д.) Вы можете использовать расширение параметров, с помощью %которого удаляются символы из конца строки или #удаляются символы из начала строки. Если вы используете один из этих символов, наименьшая соответствующая строка будет удалена. Если вы удвоите символ, самый длинный будет удален.
$ a='hello:world'
$ b=${a%:*}
$ echo "$b"
hello
$ a='hello:world:of:tomorrow'
$ echo "${a%:*}"
hello:world:of
$ echo "${a%%:*}"
hello
$ echo "${a#*:}"
world:of:tomorrow
$ echo "${a##*:}"
tomorrow
hello:worldстанет hello:woс использованием ${a%:*}?
"${a##*:}"для получения только tomorrow=)
a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'; [[$ a = ~ $ pattern]]; echo "$ {BASH_REMATCH [1]}" `. Это соответствует только если есть двоеточие. Если вы хотите, чтобы это было необязательным, необходимо использовать другой шаблон. Объяснение регулярных выражений Bash (и регулярных выражений в целом) выходит за рамки этих комментариев. Вы можете найти другие вопросы, которые обсуждают это или опубликовать свои собственные.
egrep -o '^[^:]*:'
egrepэто grep с -E. Здесь нет разницы с обычным grep. -oинструктирует grep распечатывать только ту часть строки, которая соответствует выражению. ^привязывает матч к началу строки. [^:]*соответствует нулю или более символов, которые не являются :символом. :соответствует персонажу :.
Допустим, у вас есть путь с файлом в этом формате:
/dirA/dirB/dirC/filename.file
Теперь вам нужен только путь, который включает в себя четыре "/". Тип
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/"
и ваш вывод будет
/dirA/dirB/dirC
Преимущество использования cut заключается в том, что вы также можете вырезать как самый верхний каталог, так и файл (в этом примере), так что если вы наберете
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"
ваш вывод будет
/dirA/dirB
Хотя вы можете сделать то же самое с другой стороны строки, в данном случае это не имеет особого смысла, как печатать
$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"
результаты в
dirA/dirB/dirC
В некоторых других случаях последний случай также может быть полезным. Имейте в виду, что в начале последнего вывода нет символа "/".
обрезать все после последнего экземпляра ":"
cat fileListingPathsAndFiles.txt | grep -o '^.*:'
и если вы хотите отбросить это последнее ":"
cat file.txt | grep -o '^.*:' | sed 's/:$//'
@ kp123: вы хотите заменить :на /(где должно быть двоеточие sed \/)
cutработает, но у меня ответ Дениса лучше и гибче. Кто-нибудь знает, порождает ли он новый процесс, какcut?