2013-02-23 4 views
2

С sed я read, что вы можете заменить все матчи, начиная со вторымзаменить до п-го матча

Вы можете комбинировать число с (глобальным) флагом г. Например, если вы хотите оставить первое слово в одиночку, но изменить второй, третий и т.д., чтобы быть УДАЛЕНЫ Вместо этого, используйте/2g:

пример

sed 's/foo/bar/2g' a.txt 

Однако, как мог вы заменяете совпадения до вторым, так что третий, четвертый и т. д. не затрагиваются? Что-то вроде

sed 's/foo/bar/1-2' a.txt 

ответ

2

Это может работать для вас (GNU СЭД):

sed 's/foo/&\n/2;T;h;s//bar/g;G;s/\n.*\n//' file 

Заменить п-е вхождение предполагаемому строки сама по себе и символ новой строки. Если подстановка не сработает, попробуйте скопировать пространство шаблонов (PS) в пространство удержания (HS). Сделайте замену с помощью строки замены, а затем восстановите исходную строку с измененной строкой.

также:

sed 's/foo/\n/g;s/\n/foo/3g;s/\n/bar/g' file 

где п-й +1 используется вместо 1 до п-го

0

Самого простого способа:

sed 's/foo/bar; s/foo/bar' a.txt 

Это позволит эффективно заменить 2 первые вхождения foo. Он делает два прохода на линию, заменяя всегда первое вхождение. Так как на втором проходе первый foo уже был заменен, второй проход «видит» первое второе вхождение в качестве первого.

0

расширения ответ Chirlo в ...

replace_string=s/foo/bar 
n=2 
replace_string_n=`python -c 'print "'$replace_string';"*'$n` 

sed $replace_string_n a.txt 
Смежные вопросы