2013-11-21 1 views
1

Мне нужно найти определенную строку в файле и удалить все строки в файле, пока я не вернусь к определенной строке еще раз. В основном мне нужно удалить все строки между двумя конкретными строками.
например
Необходимо удалить определенные строки в txt-файле с помощью сценария оболочки

<start /myhome > 
some entries 
some entries 
<end> 
<start ~ "/myhome[^/]+" > 
some entries 
some entries 
<end> 
<start /newhome > 
some entries 
some entries 
another entry 
different string 
<end> 
<start ~ "/myhome[^/]+" > 
some entries 
some entries 
<end> 

Ожидаемый результат должен быть:

<start /myhome > 
some entries 
some entries 
<end> 
<start /newhome > 
some entries 
some entries 
another entry 
different string 
<end> 
+2

Что вы пытались? – jmstoker

+0

У вас возникли вопросы? – Kenosis

ответ

3
perl -ne 'print if !(/<start.*?myhome\[.*?>/ .. /<end>/);' < file.txt 

EDIT: Ну, если вы хотите использовать встроенные команды ...

#!/bin/sh                  

hide_from_to() { 
    start=$1 
    end=$2 
    unset hide 

    while read line 
    do 
    if test "$line" = "$start" 
    then 
     hide=1 
    fi 
    if test -z "$hide" 
    then 
     echo $line 
    fi 
    if test "$line" = "$end" 
    then 
     unset hide 
    fi 
    done 
} 

hide_from_to '<start ~ "/myhome[^/]+" >' '<end>' < a.txt 
+0

Спасибо @Amadan. как сделать то же самое с shell-скриптами? – user2589079

+1

это * - * оболочка скриптинг. Все shell-скрипты вызывают различные исполняемые файлы для выполнения различных небольших задач, которые объединяются друг с другом. Нет никакой разницы между '/ bin/cat' и'/usr/bin/perl', за исключением того, что последнее немного более гибкое. – Amadan

+0

Но для этого нужен perl, установленный на коробке. Исправьте меня, если я ошибаюсь. Я уверен, что в большинстве блоков unix установлен perl, но я не хочу быть в исключительном случае. Спасибо за ответ. – user2589079

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

  • Нет связанных вопросов^_^