2015-09-06 2 views
1

Привет всем У меня есть код нижеНайти и заменить каждый второй с SED вхождение

находке. -type f -exec sed -i 's @ EText-No. @ New EText-No. @g '{} +

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

найти. -типа е -exec СЕПГ -i '/Subject/{:a;N;/Subject.*Subject/!Ta;s/Subject/SecondSubject/2;}/g' {} +

Я пытаясь использовать вышеприведенный код, чтобы достичь этого .. но, похоже, он не работает. Мне нужно изменить код для работы с «@» в качестве seperatore, как приведенный выше код. потому что у меня есть обратные знаки в моем файле. Любая идея, как я могу заставить код работать и использовать sperator @?

Спасибо за вашу помощь

оригинальный файл перед обработкой

<tr><th scope="row">Subject</th><td>United States -- Biography</td></tr><tr><th scope="row">Subject</th><td>United States -- Short Stories</td></tr><tr><th scope="row">EText-No.</th><td>24200</td></tr><tr><th scope="row">Release Date</th><td>2008-01-07</td></tr><tr>

После обработки

<tr><th scope="row">Subject</th><td>United States -- Biography</td></tr><tr><th scope="row">SecondSubject</th><td>United States -- Short Stories</td></tr><tr><th scope="row">EText-No.</th><td>24200</td></tr><tr><th scope="row">Release Date</th><td>2008-01-07</td></tr><tr>

Пожалуйста, обратите внимание, что второй Subject изменяется от 'Тема' в ' SecondSubject '

+0

'find. -type f -exec sed -i 's @ Subject @ {: a; N; /Subject.*Subject/! Ta; s/Subject/SecondSubject/2;} @ g' {} + ' – Udy

+1

Исправить заголовок или текст. Вы хотите «заменить каждое второе появление» или «заменить только второй экземпляр»? – Cyrus

+1

Спасибо Cyrus Мне нужно заменить каждое второе появление –

ответ

0

Попробуйте это:

sed -i '/Subject/{:a;s/\(Subject.*\)Subject/\1SecondSubject/;tb;N;ba;:b}' 

Если строка добавляется к шаблону (с помощью команды N) содержит более одного вхождения слова «субъект», то вы можете использовать эту команду, чтобы быть нацелены только на первом возникновение присоединяемой линии (второе появление пространства образца):

sed -i '/Subject/{:a;/Subject.*Subject/!{N;ba;};s/Subject/newSubject/2;}' 
+0

Вот как выглядит код после добавления обработки подпапки ** 'find. -type f -exec sed -i '/Subject/{:a;s/\(Subject.*\)Subject/\1SecondSubject/;tb;N;ba;:b}' {} + '** –

+0

Привет Казимир , Существует проблема с этим скриптом. В ситуации, когда есть до 3 экземпляров Subject. Сценарий заменяет третий. пример. Мне просто нужен скрипт для замены только второго экземпляра. Есть идеи? –

+0

Еще раз спасибо .. Ты гений –

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