Как обрезать пользовательский ввод в сценарии bash?

ОК, вот заданный пользовательский ввод:

$ myscript.sh file-name.txt

Я хотел бы обрезать «file-name.txt» для извлечения «файла» в скрипте bash

#!/bin/bash
FILENAME=$1

# trim text after '-' from user input 'file-name.txt'
# save 'file' back to $1

Мое лучшее предположение - это как-то смешивать sed и регулярное выражение, но я не эксперт в этом: (

Любые идеи?

Я попробовал предложение muru для более сложного ввода.

данный вход: ABCD-0.1.5-6.1.txt

желаемый выход: ABCD

#!/bin/bash
TRIMMED1="${1%-*}"
TRIMMED2="${1%%-*}"
TRIMMED3="${TRIMMED1%-*}"
TRIMMED4="${TRIMMED1%%-*}"
TRIMMED5="${1%-[0-9]*}"
TRIMMED6="${1%%-[0-9]*}"
echo "user input : $1"
echo "TRIMMED1 : $TRIMMED1"
echo "TRIMMED2 : $TRIMMED2"
echo "TRIMMED3 : $TRIMMED3"
echo "TRIMMED4 : $TRIMMED4"
echo "TRIMMED5 : $TRIMMED5"
echo "TRIMMED6 : $TRIMMED6"

результат: [!d8 ]

user input : A-B-C-D-0.1.5-6.1.txt
TRIMMED1 : A-B-C-D-0.1.5
TRIMMED2 : A
TRIMMED3 : A-B-C-D
TRIMMED4 : A
TRIMMED5 : A-B-C-D-0.1.5
TRIMMED6 : A-B-C-D
1
задан 20 June 2016 в 14:01

2 ответа

Вы можете сделать это с помощью

#!/bin/bash
FILENAME=$1
TRIMMED=$(echo "$FILENAME" | cut -f1 -d-)

Команда выведет поле 1, используя - в качестве разделителя.

5
ответ дан 23 May 2018 в 10:13
  • 1
    Я починил это. Я помещал f и d в неправильные места. Теперь это нормально. – Pilot6 8 June 2016 в 15:25
  • 2
    Нет, я не... – Pilot6 8 June 2016 в 15:34
  • 3
    я попробовал ур метод, и он дает un-trimmed $ 1 – RNA 8 June 2016 в 15:38
  • 4
    @muru Другие цитаты не нужны или я думаю ;-) – Pilot6 8 June 2016 в 15:39
  • 5
    К сожалению, вы не можете назначить $1. Эти кавычки необходимы: что произойдет, если имя файла, например: fi le-name.txt? – muru 8 June 2016 в 15:39

Можно сделать так:

#!/bin/bash
# trim text after '-' from user input 'file-name.txt'
FILENAME="$(sed 's/-.*//' <<< $1).txt"

# save 'file' back to $1
mv "$1" "$FILENAME"

Объяснение:

В моем примере я использую команду sed для сокращения имени, которое обычно имеет этот макет 'command/search/replacement/' , В моем примере выше я использую s как команду, которая выполняет поиск и замену, тогда -.* в качестве слова поиска (regex), который будет искать все комбинации, начинающиеся с -, а затем случайный символ . и сообщая ему это продолжается до конца с помощью *. Строка замены я оставляю пустой, это означает, что file-name.txt становится file.

<<< является bash конкретным и называется здесь-строкой, поэтому это не работает в sh. Это похоже на перенаправление в файлы только для перенаправления строки в поток вместо файла.

Окончательно, чтобы завершить запись, я добавлю .txt назад, а затем сделаю mv, чтобы переименовать файл.

4
ответ дан 23 May 2018 в 10:13
  • 1
    Я не поймал, что OP хотел mv файла. – Pilot6 8 June 2016 в 15:29
  • 2
    Np, вы все равно можете добавить его в свой ответ, все здесь действительны. – Videonauth 8 June 2016 в 15:31
  • 3
    немного больше объяснений о роли & lt; & lt ;, пожалуйста. – RNA 8 June 2016 в 15:57
  • 4
    Добавил его в свой ответ. – Videonauth 8 June 2016 в 16:16

Другие вопросы по тегам:

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