Відповіді:
Приклад може бути корисним, але якби я вас правильно зрозумів, це спрацює:
echo "Hello: world" | cut -f1 -d":"
Це перетворить "привіт: світ" у "привіт".
basenameі cut, див. Відповідь Денніса нижче
cutможна читати зі stdin, тому краще, особливо якщо у вас дуже довгий рядок, який потрібно обробити, як і вміст файлу.
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]}" `. Це відповідає лише за наявності двокрапки. Якщо ви хочете, щоб це було необов’язково, потрібно було б використовувати інший візерунок. Пояснення реджексів Баша (і загально-регулярних виразів) виходить за рамки цих коментарів. Ви можете знайти інші питання, які обговорюють це, або опублікувати своє.
egrep -o '^[^:]*:'
egrepгреп -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: ви б хотіли замінити :на /(де повинна бути двокрапка \/)
cutпрацює, але я відповідь Денніса краща і гнучкіша. Хтось знає, чи породжує він такий новий процесcut?