2016-05-31 2 views
1

Я бегу что-то в Perl и следующая команда, которая удаляет последовательные повторяющиеся строки (только держа одну из них)Выбираясь в Баш в Perl

system("sed -i '$!N; /^\(.*\)\n\1$/!p; d' *[13579].csv");

Однако, когда я запускаю это, я получить следующее сообщение об ошибке:

sed: -e expression #1, char 11: unterminated address regex

у меня есть чувство, что это имеет отношение к моему побегу, но я не слишком уверен, как я довольно неопытный с Perl и Башем. Я знаю, что знаки доллара должны быть сбежаны, но как насчет обратных косых черт? У кого-нибудь есть хороший ресурс, который они могут указать мне, чтобы узнать больше об ускорении bash в perl? Благодаря!

+2

Escape the slashes \ – mkHun

+0

@mkHun Не все из них правы - в настоящее время он выглядит так: 'system (" sed -i '\ $! N;/^ \\ (. * \\) \\ n \\ 1 \ $ /! P; d '* [13579] .csv ")'. Правильно ли это выглядит? – JDY

+3

Если вам нужно избегать вещей, вы делаете это неправильно: если вы запустите программу ('sed', в этом случае), используя' exec''ing массив argv, оболочки нет, поэтому ничего не должно быть скорлупа маскирование. Да, это означает, что вы не получаете globbing, но perl может делать подталкивание. –

ответ

1

При размещении sed в Perl это может быть суетливо, есть пара вещей, которые вы могли бы сделать. Первым было бы изменить тип кавычек, которые вы обмениваете вокруг системы команд, и шаблон sed (перевернуть внешний на один, внутренний на двойной); другим вариантом было бы избежать символов \ в sed.

system('sed -i "$!N;/^\(.*\)\n\1$/!p;d" *filename'); 

Примечания: так как ваше имя файл использует специальные символы, что может быть маскирование необходимо для того, чтобы работать с подстановкой (например, *\\[13579].csv.); Экранирование будет что-то вроде этого:

system("sed -i '$!N;/^\\(.*\\)\\n\\1\$/!p;d' *\\[13579].csv"); 

Если имя файла происходит включать пробелы, те должны были бы избежать, а также.

system("sed -i '$!N;/^\\(.*\\)\\n\\1\$/!p;d' *\\[12345]\\ \\[13579].csv"); 

sed затем найти любые файлы, соответствующие *[12345] [13579].csv и в месте их редактировать.

+0

Большое спасибо! Очень информативно и полезно. Я буду помнить об этом. – JDY

Смежные вопросы