удалить путь «/» из имени файла

ПОЛНОСТЬЮ объяснить переносимую команду (раз уж кто-то спросил), чтобы ЛЮБОЙ мог понять это:

sed 's/.\(.\)$/\1/' file.txt

Во-первых, «очевидное»: эта строка состоит имени команды ( sed ) и двух отдельных аргументов, которые передаются этой команде оболочкой. Одиночные кавычки удаляются оболочкой, поэтому sed "видит" в качестве своих аргументов:

s /. \ (. \) $ / \ 1 /

и

file.txt

Поскольку ни один из аргументов sed не начинается с дефиса, он не интерпретирует ни один из них как параметры.

Первый аргумент интерпретируется как запускаемая команда редактирования, а любые другие аргументы (в данном случае только один, file.txt ) интерпретируются как имена файлов, из которых следует читать текст. для редактирования командой редактирования (первый аргумент).

(Обратите внимание, что отредактированный текст записывается в «стандартный вывод» sed , то есть обратно в ваш терминал, в окно командной строки - он не записывается обратно в файл.)

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


Теперь мы разберем саму команду редактирования:

s /. \ (.\) $ / \ 1 /

Команда редактирования начинается с буквы s , что означает «заменить». От символа, следующего за «s» (в данном случае это / ), до следующего экземпляра того же символа (снова / ) - это шаблон , который подлежит замене. Другими словами, он определяет, как должен «выглядеть» текст, который должен быть заменен - ​​он сообщает sed , как «узнать», когда он нашел текст, который следует заменить (заменить).

Шаблон в этом случае:

. \ (. \) $

(Правильный термин вместо «шаблон» на самом деле regex , первоначально сокращение от «регулярное выражение. «Я не буду здесь углубляться в более широкую тему регулярных выражений.)

Это регулярное выражение начинается с точки (. ), которая является« подстановочным знаком », означающим« любой отдельный символ ». Он соответствует (описывает, символизирует) любому одиночному символу текста.

Обратная косая черта ( \ ) часто используется в командах оболочки и регулярных выражениях в качестве «escape-символа». В общем, это означает, что либо он удаляет особое значение символа, который следует за ним, либо добавляет особое значение следующему символу.

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

Точка (. ) в круглых скобках снова соответствует любому одиночному символу.

Знак доллара ( $ ) называется привязкой, и соответствует концу строки текста. В отсутствие этой привязки регулярное выражение будет просто соответствовать любым двум символам (в частности, оно будет соответствовать первым двум символам в каждой строке текста, считываемого из файла с именем file.txt ), и (из-за экранированных скобок) sed будет «отмечать» второй из двух символов для последующего обращения к нему.

Поскольку регулярное выражение привязано к концу строки, две точки должны соответствовать последним двум символам в каждой строке текста (а последний символ отмечен для ссылки назад к позже).

Следующая часть команды s (подстановка) берется из второго экземпляра символа, следующего за s (в данном случае косая черта, / ) , до третьего экземпляра символа, следующего за s . Это называется шаблоном замены . Он указывает, что sed должен поместить вместо текста, соответствующего поисковому шаблону (регулярное выражение).

В этом случае шаблон замены:

\ 1

Опять же, обратная косая черта используется для экранирования следующего за символом символа, и в данном случае это снова для добавления особый смысл, а не отнять особое значение.

Обратная косая черта, за которой следует цифра (от 1 до 9), называется обратной ссылкой . Это то, что отсылает обратно к тексту, сопоставленному в скобках, сгруппированных в шаблоне поиска. Поскольку число 1 , это относится к группе первых круглых скобок. (В этом случае, конечно, существует только одна такая группировка.)

Таким образом, эта команда редактирования означает использование текста, сопоставленного в этих экранированных скобках (который является последним символом строки), для замены сопоставленного текста целым регулярным выражением поиска (которое является последними двумя символами в строке).

В результате из каждой строки будет удален предпоследний символ.

Или, точнее, sed будет читать каждую строку текста из файла с именем file.txt , находящегося в текущем рабочем каталоге; для каждой строки он заменит последние два символа строки на единственный последний символ этой строки; и он будет печатать каждую измененную строку в своем стандартном выводе .

1
31.08.2016, 02:53
2 ответа

Заменить / на _ :

tag=${tag//\//_}
3
27.01.2020, 23:19

на zsh :

autoload zmv # best in ~/.zshrc
zmv -n '(dir*)/(dir*)/*GABA*.dat' 'GABA/${(L)1}${(L)2}.dat'

Удалить - n если доволен.

(L) - флаг раскрытия параметра для преобразования раскрытия в нижний регистр.

1
27.01.2020, 23:19

Теги

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