возврат строк, соответствующих для окружения соответствия шарика

Действительно хорошее видео для наблюдения: http://peepcode.com/products/meet-emacs

Делает превосходное задание покрытия всех основ, но оно будет стоить некоторых денег для получения.

Я задал подобный вопрос на StackOverflow и скорее затем мне копирующий все по выезду:

https://stackoverflow.com/questions/2393787/any-good-emacs-intro-videos

3
31.05.2011, 15:06
2 ответа

Оболочки POSIX (например, удар, тире, ksh, …) принимают a ${var%suffix} создайте, который может использоваться для удаления запаздывающей части из значения переменной. Например, если path="sub/file.txt", затем ${path%.txt} расширяется до sub/file.

Существует симметричная конструкция для удаления префикса: ${var#prefix}. Префикс может быть шаблоном. Удвоение # разделяет самый длинный префикс соответствия. Например, если path=sub/dir/file.txt, затем ${path##*/} расширяется до file.txt${path#*/} расширяется до dir/file.txt). То же идет для суффиксов и %.

Так, в Вашем случае Вы могли записать, это (обратите внимание, что Вы не можете объединить разделение префикса и отсечение суффиксов в единственное расширение, по крайней мере, не только с конструкциями POSIX):

for f in sub/*.txt; do
  base=${f%.txt}
  base=${base##*/}
  enscript -b "" -o "$base.ps" "$f"
  ps2pdf "$base.ps" "$base.pdf"
done

С другой стороны, команда базового имени GNU принимает дополнительный второй аргумент, который является расширением файла для удаления. Например, если $f file.txt, затем $(basename $f .txt) расширяется до file.

Отметьте, однако, это basename удаляет всю информацию о пути за исключением последнего компонента, поэтому если Вы хотите удалить просто расширение, необходимо отложить это (см. команду dirname).

4
27.01.2020, 21:11
  • 1
    @Riccardo: Ничего себе, это было быстро. Спасибо за ответ. Комментарий и вопрос. 1) ссылка для basename имеет опечатку (/вместо.) и 2) это ссылки на то, что похоже на утилиты C. Я пропускаю что-то? Я должен был сказать, что мое общее предпочтение сценариев оболочки является мобильностью, таким образом, ${path%.txt} сделает меня. Я предполагаю GNU basename вещь, независимо от того, что это. не является портативным. –  Faheem Mitha 30.05.2011, 23:29
  • 2
    @Riccardo: Я думаю, что Ваш сценарий имеет ошибку. Выполненный точно, как записано я получаю ошибку: syntax error near unexpected token $ prefix= {f %. txt}'. If I take out the semi-colon and add a сделайте' это работает. –  Faheem Mitha 30.05.2011, 23:42
  • 3
    @Gilles: Вы забыли фиксировать basename URL. :-) –  Faheem Mitha 31.05.2011, 00:00
  • 4
    @Faheem Mitha: Зафиксированный ссылки. Я предполагаю, что Gilles уже исправил сценарий, поскольку я могу выполнить его правильно? –  Riccardo Murri 31.05.2011, 00:03
  • 5
    @Riccardo: Он сделал, да. Этому просто было нужно добавление a do.Спасибо. –  Faheem Mitha 31.05.2011, 00:12

Портативный путь состоит в том, чтобы разделить расширение с ${f%.*} и каталог с ${f##*/} (или использовать basename).

В zsh можно применить различные преобразования к расширению параметра, включая модификаторы истории такой как r разделять одно расширение и t разделять часть каталога.

for x in sub/*.txt; do
    enscript -b "" -o ${x:t:r}.ps $x
    ps2pdf ${x:t:r}.ps ${x:t:r}.pdf
done

Можно применить модификаторы истории к шаблонам шарика также.

for x in sub/*.txt(:r:t); do
    enscript -b "" -o $x.ps sub/$x.txt
    ps2pdf $x.ps $x.pdf
done
4
27.01.2020, 21:11
  • 1
    Как версия @Riccardo, это не разделяет продвижение sub/. Как прокомментировано выше, basename=${prefix#sub/} работы, в том же направлении как подход @Riccardo. –  Faheem Mitha 31.05.2011, 11:11
  • 2
    хорошо, zsh явно удобно.Спасибо. –  Faheem Mitha 31.05.2011, 14:53
  • 3
    я сделал некоторые исправления к своему сценарию в вопросе. Просто упомянув это в случае, если Вы испытываете желание корректировать свой ответ. –  Faheem Mitha 31.05.2011, 19:36

Теги

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