2013-10-25 2 views
1

У меня есть файлы с текстом ниже (и многое другое).sed поиск заменить шаблон

import (
    "http" 
    "web" 
) 

Я хочу, чтобы заменить все "web" с "pkg/web" (во всех файлах). так что результат должен

import (
     "http" 
     "pkg/web" 
    ) 

Я стараюсь sed как

find . -type f -print0 | xargs -0 sed -i '/"web"/c\"pkg/web"' 

, который дает ошибку.

sed: 1: "test" invalid command code . 

Каков правильный путь?

Спасибо.

ответ

1

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

Хорошая новость заключается в том, что sed допускает различные разграничения регулярных выражений.

Это СЭД с другой регулярным выражением разделителем должен работать:

sed -i.bak 's~^\(*\)"web" *$~\1"pkg/web"~g' 

UPDATE: Чтобы сохранить пробельный на LHS искомой строки:

find . -type f -print0 | xargs -0 sed -i '' 's~^\([[:space:]]*\)"web"[[:space:]]*$~\1"pkg/web"~g' 
+0

Спасибо. Я не следую шаблону, но для обеспечения безопасности мы можем обеспечить соответствие шаблону «web» и заменяющему тексту «pkg/web» ограничивается полной линией. означает, что в этой строке нет другого контента. Возможно, это уже так, пожалуйста, подтвердите. – bsr

+0

Да, см. Мой отредактированный ответ. Он заменит только '' web '', если на линии нет другого содержимого, кроме пробелов с обеих сторон. – anubhava

+0

это не сработало. он создал файл test.bak, с тем же содержимым! – bsr

0

находки. -тип f -print0 | xargs -0 sed -i -e's @ "web" @ "pkg/web" @g '

Это отлично работает для меня.

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