простая команда для разделения заголовка и нижнего колонтитула из файла

Нет, это не переоценено. На практике это является самым недооцениваемым.:-)

Моя малочисленная команда на работе, например, совместно использует машину RHEL для технической разработки: создание материала, тестируя и т.д. Все используют учетные записи отдельного пользователя, но мы также совместно используем пароль root, так как людям время от времени нужно это для быстрых задач системного администратора. Это также привело к нам умеющий полить из шланга ОС несколько раз в ее короткой продолжительности жизни. Кто-то создающий определенную версию libc удалил систему libc глупым rm вызов. В другом любопытном инциденте отсутствовала таблица разделов. (Хорошо, это не имело никакого отношения к полномочиям.) Отдых команды заблокирован, пока поломка не фиксируется. Одно решение состоит в том, чтобы сделать, чтобы кто-то добровольно предложил поднимать задачи системного администратора. К этой точке мы не заботились слишком много, кроме позволить людям извлекать свои уроки: всем нам нужны некоторые зубные метки на наших задних частях, и это относительно недорогие зубные метки.

Действительно любопытное могло бы хотеть следовать за принципом наименьшего количества полномочия и прочитать газету Ken Thompson, "Отражения О Доверии Доверию". ("Мораль очевидна. Вы не можете доверять коду, который Вы не полностью создали сами".)

4
18.03.2019, 04:06
2 ответа

Используя sed:

 sed -n '/<Document>/,/<\/Document>/ p' yourfile.xml

Объяснение:

  • -n делает sed тихий, означая это не производит целое содержание файла,
  • /pattern/ поиски строк включая указанный шаблон,
  • a,b (запятая), говорит sed выполнить действие со строками от a кому: b (где a и b будьте определены путем соответствия вышеупомянутым шаблонам),
  • p обозначает печать и действие, выполненное на строках, которые соответствовали вышеупомянутому.

Править: Если требуется дополнительно разделить пробел прежде <Document>, это может быть сделано этот путь:

 sed -ne '/ <Document>/s/^ *//' -e '/<Document>/,/<\/Document>/ p' yourfile.xml
6
27.01.2020, 20:51
  • 1
    благодарит, я - sed новичок. Что относительно того, чтобы расположить пробел с отступом? Что делает''? –  Bastl 20.10.2011, 16:50
  • 2
    Это работает с пробелом, а также любым другим окружением символов <Document>. Посмотрите обновление моего ответа для более глубокого объяснения. хороший –  rozcietrzewiacz 20.10.2011, 16:59
  • 3
    . это почти прекрасно. Теперь я должен снять изоляцию с предыдущего пробела от первой строки. Действительно ли это возможно в Вашей команде? –  Bastl 20.10.2011, 17:06
  • 4
    Да, хотя это будет немного более сложно - посмотрите обновление. (На данном этапе я не уверен, является ли это самый простой путь.) –  rozcietrzewiacz 20.10.2011, 17:36
  • 5
    @Bastl это, если существует какой-либо текст между </Document> и следующее <Document>, это будет разделено. –  Gilles 'SO- stop being evil' 20.10.2011, 20:29

Препятствовать тому, чтобы текст был разделен между </Document> и следующее <Document> Вам, вероятно, придется использовать серию sed команды (cf. Комментарий жабр выше).

По существу sed читает весь файл в буфер хранения (так, чтобы содержание файла можно было рассматривать как одну строку), и отмечает первое и последнее Document теги для последующей обработки.

# version 1
# marker: HERE
cat file.xml | 
sed -n '1h;1!H;${;g;s/\(<Document>.*<\/Document>\)/HERE\1HERE/g;p;}' | 
sed -n -e '/HERE<Document>/,/<\/Document>HERE/ p' | 
sed -e 's/^ *HERE\(<Document>\)/\1/' -e 's/\(<\/Document>\)HERE *$/\1/'

# version 2    (using the Bash shell)
# marker: $'\001'
cat file.xml | 
sed -n $'1h;1!H;${;g;s/\\(<Document>.*<\\/Document>\\)/\001\\1\001/g;p;}' | 
sed -n -e $'/\001<Document>/,/<\\/Document>\001/ p' | 
sed -e $'s/^ *\001//' -e $'s/\001 *$//' | 
cat -vet

... но я предполагаю, что все это могло быть сделано более изящно (и надежно) использование xmlstarlet!

1
27.01.2020, 20:51

Теги

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