Удалить блок текста с помощью sed [duplicate]

Кажется, что это редкий случай, но вот что со мной произошло:

Мы использовали @Inject вместо @Autowired, который является стандартом javaee, поддерживаемым Spring. В каждом месте он работал нормально, а бобы вводили правильно, а не в одно место. Инъекция компонента выглядит одинаково

@Inject
Calculator myCalculator

Наконец, мы обнаружили, что ошибка заключалась в том, что мы (фактически, функция автозавершения Eclipse) импортировали com.opensymphony.xwork2.Inject вместо javax.inject.Inject!

Итак, чтобы суммировать, убедитесь, что ваши аннотации (@Autowired, @Inject, @Service, ...) имеют правильные пакеты!

9
задан kasper 21 February 2011 в 23:18
поделиться

6 ответов

sed -n '/pattern1/{p; :a; N; /pattern2/!ba; s/.*\n//}; p' inputfile

Объяснение:

/pattern1/{         # if pattern1 is found
    p               # print it
    :a              # loop
        N           # and accumulate lines
    /pattern2/!ba   # until pattern2 is found
    s/.*\n//        # delete the part before pattern2
}
p                   # print the line (it's either pattern2 or it's outside the block)

Редактирование:

Некоторые версии sed должны быть загружены ложкой:

sed -n -e '/pattern1/{' -e 'p' -e ':a' -e 'N' -e '/pattern2/!ba' -e 's/.*\n//' -e '}' -e 'p' inputfile
13
ответ дан Dennis Williamson 23 August 2018 в 01:23
поделиться
  • 1
    это дает мне sed: -e expression #1, char 58: Unknown option to 's'. Моя версия sed - 3.02 – kasper 22 February 2011 в 01:47
  • 2
    @kasper: см. мой отредактированный ответ. – Dennis Williamson 22 February 2011 в 02:01
  • 3
    @Dennis: О, версия от редактирования делает правильные вещи. Еще раз спасибо! – kasper 22 February 2011 в 02:15
  • 4
    Или с меньшей черной магией sed '/pattern1/,/pattern2/{/pattern1/b;/pattern2/b;d}' inputfile :) – user 22 February 2011 в 14:23
  • 5
    @pooh: ваш первый не работает с этими тестовыми данными (строки с «xxx» не должны печататься, все остальное должно быть): echo -e 'aaa\npattern1\ncccxxx\ndddxxx \npattern2\nfff\nggg\npattern1\nAAAxxx\nBBBxxx \nCCCxxx\nDDDxxx\npattern2\nEEE\nFFF' – Dennis Williamson 22 February 2011 в 15:38

Это легко сделать с awk:

BEGIN { doPrint = 1; }
/pattern1/ { doPrint = 0; print $0; }
/pattern2/ { doPrint = 1; }
{ if (doPrint) print $0; }

Я нашел sed info довольно простое чтение, со многими примерами. То же самое для awk .

4
ответ дан Daniel Gallagher 23 August 2018 в 01:23
поделиться
awk '/pattern1/{g=1;next}/pattern2/{g=0;next}g' file
4
ответ дан kurumi 23 August 2018 в 01:23
поделиться

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

sed '/pattern1/,/pattern2/{//!d}' file
8
ответ дан potong 23 August 2018 в 01:23
поделиться
  • 1
    Если кто-то другой использует это с BSD sed (то есть Mac OSX), и вы получите сообщение об ошибке extra characters at the end of d command, просто добавьте ; после d, как это: sed '/pattern1/,/pattern2/{//!d;}' file – rkd 5 December 2016 в 23:10
  • 2
    как вы это делаете, включая шаблоны? – qodeninja 30 December 2017 в 02:50

sed '/ PATTERN1 /, / PATTERN2 / d' FILE

1
ответ дан publkaccion 23 August 2018 в 01:23
поделиться

Вы также можете использовать текстовый редактор Unix ed:

echo '
pattern1
garbage
pattern2
' > test.txt

cat <<-'EOF' | sed -e 's/^ *//' -e 's/ *$//' | ed -s test.txt &>/dev/null
  H
  /pattern1/+1,/pattern2/-1d
  wq
EOF

Для получения дополнительной информации см .: Редактирование файлов с помощью текстового редактора из сценариев

0
ответ дан tylo 23 August 2018 в 01:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: