Как я удаляю суффикс файла и соединяю часть каналом от строки пути в Bash?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

366
задан Benjamin W. 24 October 2018 в 11:42
поделиться

9 ответов

Вот то, как сделать это с # и операторами % в Bash.

$ x="/foo/fizzbuzz.bar"
$ y=${x%.bar}
$ echo ${y##*/}
fizzbuzz

${x%.bar} мог также быть ${x%.*} для удаления всего после точки или ${x%%.*} для удаления всего после первой точки.

Пример:

$ x="/foo/fizzbuzz.bar.quux"
$ y=${x%.*}
$ echo $y
/foo/fizzbuzz.bar
$ y=${x%%.*}
$ echo $y
/foo/fizzbuzz

Документация может быть найдена в руководство Bash. Ищите ${parameter%word} и ${parameter%%word} запаздывающий раздел соответствия части.

524
ответ дан Zan Lynx 23 November 2019 в 00:08
поделиться

посмотрите на команду базового имени:

NAME=$(basename /foo/fizzbuzz.bar .bar)
205
ответ дан zigdon 23 November 2019 в 00:08
поделиться

Чистый удар путь:

~$ x="/foo/bar/fizzbuzz.bar.quux.zoom"; 
~$ y=${x/\/*\//}; 
~$ echo ${y/.*/}; 
fizzbuzz

Эта функциональность объяснена на ударе человека при "Расширении Параметра". Не колотят пути, имейтесь в большом количестве: awk, жемчуг, sed и так далее.

РЕДАКТИРОВАНИЕ: Работы с точками в суффиксах файла и не должны знать суффикс (расширение), но работа doesn’t с точками в имя само.

12
ответ дан Nick Lockwood 23 November 2019 в 00:08
поделиться

Базовое имя и функции dirname - то, что Вы после:

mystring=/foo/fizzbuzz.bar
echo basename: $(basename "${mystring}")
echo basename + remove .bar: $(basename "${mystring}" .bar)
echo dirname: $(dirname "${mystring}")

произвел:

basename: fizzbuzz.bar
basename + remove .bar: fizzbuzz
dirname: /foo
10
ответ дан Jerub 23 November 2019 в 00:08
поделиться
perl -pe 's/\..*$//;s{^.*/}{}'
3
ответ дан mopoke 23 November 2019 в 00:08
поделиться

Если Вы не можете использовать базовое имя, как предложено в других сообщениях, можно всегда использовать sed. Вот (ужасный) пример. Это не является самым большим, но это работает путем извлечения требуемой строки и замены входа требуемой строкой.

echo '/foo/fizzbuzz.bar' | sed 's|.*\/\([^\.]*\)\(\..*\)$|\1|g'

, Который получит Вас вывод

fizzbuzz

3
ответ дан nymacro 23 November 2019 в 00:08
поделиться

Используя basename предполагает, что Вы знаете, каково расширение файла, не так ли?

И я полагаю, что различные предложения регулярного выражения не справляются с именем файла, содержащим больше чем один

, следующее, кажется, справляется с двойными точками. О, и имена файлов, которые содержат "/" сами (только для ударов)

Для перефразирования Паскаля, "Извините этот сценарий является таким длинным. У меня не было времени для создания его короче"


  #!/usr/bin/perl
  $fullname = $ARGV[0];
  ($path,$name) = $fullname =~ /^(.*[^\\]\/)*(.*)$/;
  ($basename,$extension) = $name =~ /^(.*)(\.[^.]*)$/;
  print $basename . "\n";
 
4
ответ дан Andrew Edgecombe 23 November 2019 в 00:08
поделиться

Базовое имя делает это, удаляет путь. Это также удалит суффикс, если дали и если бы это соответствует суффиксу файла, но необходимо было бы знать, что суффикс дает команде. Иначе можно использовать mv и выяснить то, что новое имя должно быть некоторым другим путем.

1
ответ дан waynecolvin 23 November 2019 в 00:08
поделиться

Остерегайтесь предлагаемого решения perl: оно удаляет все, что находится после первой точки.

$ echo some.file.with.dots | perl -pe 's/\..*$//;s{^.*/}{}'
some

Если вы хотите сделать это с помощью perl, это сработает:

$ echo some.file.with.dots | perl -pe 's/(.*)\..*$/$1/;s{^.*/}{}'
some.file.with

Но если вы используете Bash, решения с y = $ {x%. *} (или basename " $ x ".ext , если вы знаете расширение) намного проще.

2
ответ дан 23 November 2019 в 00:08
поделиться
Другие вопросы по тегам:

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