2012-04-25 4 views
0

Я хотел бы удалить текст между двумя словами в каждом .x файла и я попытался:СЭД первой замены текста вхождения

find temp -type d | while read DIRNAME 
do 
    sed -i '/abcd1/,/abcd2/d' ~/Desktop/$DIRNAME/.x 
done 

Проблема заключается в том, что я хочу, чтобы удалить только первое вхождение этого, но

sed -i '0,/abcd1/,/abcd2/d' ~/Desktop/$DIRNAME/.x 

не работает.

+1

Можете ли вы привести пример файла, ожидаемый результат и фактический результат? – sinelaw

ответ

1
sed -ie 'bb; :a q; :b s/from/into/; ta' test.txt 
  • bb; - филиал в b знака (пропуск команды q ПИФ);
  • :a q; - a знак с q команда uit;
  • :b s/from/into - b знак с заменой;
  • ta - прыжок в a знак, если замена выполнена успешно;
  • ; - разделитель команд в sed.

Надеюсь, что это поможет.

1

Один из способов:

sed -e '/3/,/6/ { /6/ ba ; d }; b ; :a ; $! { N ; ba }; s/[^\n]*\n//' 

EDIT объяснить:

/3/,/6/   # Range between line that matches '3' and other line that matches '6'. 
{ 
    /6/ ba  # When matches last line of the range, goto label 'a'. 
    d    # Delete each line in the range. 
} 
b    # This command will be executed in lines until first match in the 
       # range. It prints the line and begin loop reading next one. 
:a    # Label 'a'. 
$!    # While not found last line ... 
{ 
    N    # Append next line to current pattern space. 
    ba   # Go to label 'a'. Enter a loop reading each line until last one. 
} 
s/[^\n]*\n// # Remove until first '\n' (content of last line of the range) and print 
       # the rest. 

тест:

Содержание infile:

1 
2 
3 
4 
5 
6 
7 
1 
2 
3 
4 
5 
6 
7 

Run это нравится:

sed -e '/3/,/6/ { /6/ ba ; d }; b ; :a ; $! { N ; ba }; s/[^\n]*\n//' infile 

Output (удаляет только линии между '3' и '6' один раз):

1 
2 
7 
1 
2 
3 
4 
5 
6 
7 
+0

Спасибо, это сделал трюк :) – Andrei

+0

Я понял, что мне нужно удалить первое появление, только если есть два или более случаев. Я попытался использовать переменную и условие if, но это не сработало. – Andrei

0

Это может работать для вас:

sed '/word1/!b;:a;/word1.*word2/{s///;tb};$!{N;ba};:b;$!{n;bb}' file 

приведенные выше работы для слов, для использования в блоках линий:

sed '/block1/,$!b;x;/./{x;b};x;/block1/,/block2/{/block2/h;d}' file 

EDIT:

Для удаления first occurence, only if there are more than one occurrences:

sed '/word1/!b;:a;/\(word1\).*\(word2\)\(.*\1.*\2\)/{s//\3/;tb};$!{N;ba};:b;$!{n;bb}' file 
+0

Благодарю вас за ответ, это работает, но если у меня есть только одно вхождение, оно удаляется, и я не хочу этого, мне нужно удалить первое вхождение, только если есть несколько случаев. – Andrei

+0

ОК см. EDIT для нового решения. – potong

+0

Благодарю вас за ваше время, но это ничего не делает для файла, я использовал «sed -i»/x /! B;: a;/\ (abcd1 \). * \ (Abcd2 \) \ (. * \ 1. * \ 2 \)/{s // \ 3 /; tb}; $! {N; ba} ;: b; $! {N; bb} 'test.x "и у меня есть файл с двумя вхождениями abcd1 abcd2 – Andrei

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