ПОЛНОСТЬЮ объяснить переносимую команду (раз уж кто-то спросил), чтобы ЛЮБОЙ мог понять это:
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
, находящегося в текущем рабочем каталоге; для каждой строки он заменит последние два символа строки на единственный последний символ этой строки; и он будет печатать каждую измененную строку в своем стандартном выводе .
на zsh
:
autoload zmv # best in ~/.zshrc
zmv -n '(dir*)/(dir*)/*GABA*.dat' 'GABA/${(L)1}${(L)2}.dat'
Удалить - n
если доволен.
(L)
- флаг раскрытия параметра для преобразования раскрытия в нижний регистр.