Заменить только первое совпадение в нескольких файлах на perl - PullRequest
7 голосов
/ 08 июня 2011

Мне нужно заменить текст в нескольких файлах CSS, но только в первый раз.

Я пытался заменить на:

perl -pi -e 's/(width:).*;/$1 100%;/' filename.css

Но это заменяет значение послекаждое вхождение 'width:' в файле, даже если я не использую модификатор / g.Я использую это на недавней машине с Ubuntu.

Ответы [ 5 ]

6 голосов
/ 08 июня 2011

Никто не затронул вопрос о вашем фактическом заглавном вопросе.Я рекомендую такой же подход, как здесь, только измененный:

perl -pie '!$subbed{$ARGV} and s/(width:).*;/$1 100%;/ and $subbed{$ARGV}++' *.css

Безразмерный $ARGV - это имя текущего файла .Таким образом, для каждого файла вы заменяете только первое вхождение.«Glob» *.css отправит несколько файлов.Если вы сделаете скалярное переключение, которое предлагают другие люди, вы измените только первое вхождение в файле first с этим шаблоном.(Хотя, возможно, это то, что вы хотите.)

5 голосов
/ 15 мая 2012

Если вы читаете в режиме абзаца, каждый файл занимает только одну строку; следовательно, s /// без модификатора / g заменит первый экземпляр в каждом файле, а затем перейдет к следующему файлу:

perl -0777 -pi -e's/(width:).*;/$1 100%;/' *.css
4 голосов
/ 08 июня 2011

Вы можете остановить замену после первого:

perl -pi -e '$a=1 if(!$a && s/(width:).*;/$1 100%;/);' filename.css
0 голосов
/ 08 июня 2011

Может быть s/(width:).*;/$1 100%;/o подойдет?

0 голосов
/ 08 июня 2011

Вы можете попробовать это:

perl -pi -e 's/(width:).*;/$a?$&:++$a&&"$1 100%;"/e' filename.css
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...