2013-02-22 1 views
4

Я пытаюсь использовать sed, чтобы раскомментировать блок текста в этом файле конфигурации. Код Я придумал uncomments 7 строк, начиная с и включая совпадение шаблонов в первом матче, но мне нужно, чтобы он работал только во втором матче и пропускал первое совпадение.Как раскомментировать несколько строк во втором совпадении с использованием sed?

    sed '/#location.~.*$/,+6s/#/ /' default.conf 

# proxy the PHP scripts to Apache listening on 127.0.0.1:80 
# 
#location ~ \.php$ { 
# proxy_pass http://127.0.0.1; 
#} 

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 
# 
#location ~ \.php$ {     
# root   html; 
# fastcgi_pass 127.0.0.1:9000; 
# fastcgi_index index.php; 
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 
# include  fastcgi_params; 
#} 
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 
# 

>

ответ

3

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

sed 'x;/./{x;/#location/,+6s/#/ /;b};x;/#location/h' file 

Используйте трюм пространство (HS), чтобы сохранить флаг и действовать только по диапазону адресов, если флаг был установлен.

+0

Вау .. Я просто попробовал это, и он работает так хорошо. –

+0

Я хотел сказать спасибо, ты спас меня много времени –

+0

Это волшебство! Спасибо, что научил меня немного больше о sed :) – codekoala

0

С (это является более подходящим, чем & проще sed для выполнения этой задачи):

awk -F# ' 
    /^#location/{l++} 
    l<2 {print} 
    l==2{print $2} 
    l==2 && $2 ~ "}" {l=0;next} 
' file.txt 
+0

спасибо, я не мог заставить это работать так, как есть, я, должно быть, сделал что-то неправильно. Тем не менее, я ценю вашу помощь. –

1

Я бы сказал, что использование сценария оболочки для изменения ваших кодов является рискованным. многие специальные случаи могут привести к его провалу.

Вместо этого я бы назвал это «преобразование текста». он удалит ведущий # от #location ~ \.php$ { линии до первой #} линии.

AWK Onliner:

awk '/^#location ~/{s=1}s{if($0~/^#}/)s=0;sub("#"," ")}1' file 

смотри пример: (файл представляет собой содержание)

kent$ awk '/^#location ~/{s=1}s{if($0~/^#}/)s=0;sub("#"," ")}1' file 
# proxy the PHP scripts to Apache listening on 127.0.0.1:80 
# 
location ~ \.php$ { 
    proxy_pass http://127.0.0.1; 
} 

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 
# 
location ~ \.php$ {     
    root   html; 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_index index.php; 
    fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 
    include  fastcgi_params; 
} 
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 
# 

Я надеюсь, что выше вывод, что вам нужно.

+0

Большое спасибо, но мне нужно, чтобы первый матч был проигнорирован, и у меня нет опыта работы с awk, чтобы поиграть и модифицировать его. –