2013-02-14 3 views
0

Я пытался заменить% 2 $ U сСЕПГ команда заменить строку

<ph name='NUMBER' ex='%2$u'/> 

через несколько файлов с помощью следующей команды.

find . -name "*.txt" -print | xargs sed -i 's/%2$u/<ph name='NUMBER' ex='%2$u'\/>/g' 

А на самом деле% 2 $ U становится заменен как этот

<ph name=NUMBER ex=%2/> 

Может кто-нибудь дать мне решение? Заранее спасибо.

-Ranjit

ответ

0

Вы не можете вставлять одинарные кавычки внутри одной строки в кавычках. Попробуйте:

find . -name "*.txt" -print | 
    xargs sed -i 's/%2$u/<ph name='"'"'NUMBER'"'"' ex='"'"'%2$u'"'"'\/>/g' 

или

find . -name "*.txt" -print | 
    xargs sed -i "s/%2\$u/<ph name='NUMBER' ex='%2\$u'\/>/g" 

В зависимости от версии СЭД, вам может понадобиться, чтобы избежать $, чтобы СЭД, чтобы предотвратить его только сопрягая конца строки:

xargs sed -i "s/%2\\\$u/<ph name='NUMBER' ex='%2\\\$u'\/>/g" 
+0

'$ 'нужно будет сбежать в любом случае, нет? –

+0

Внутри одной строки с кавычками вам не нужно скрывать '' 'для оболочки. Некоторые версии 'sed' не будут сопоставлять его с концом строки, если он не отображается в конце шаблона, но чтобы быть безопасным, вероятно, он должен быть экранирован до sed. –

0

Когда quoting with single quotes, следующая следующая цитата заканчивается цитированием. Таким образом, последнее выражение на самом деле состоит из следующих частей:

's/%2$u/<ph name=' 
NUMBER 
' ex=' 
%2$u 
'\/>/g' 

И внутри некотируемым частей, parameter expansion происходит. Таким образом, $u получает замену на значение параметра u или пустую строку, если она не существует. Вы можете проверить это с помощью простого echo:

echo 's/%2$u/<ph name='NUMBER' ex='%2$u'\/>/g' 

Чтобы избежать этого, либо использовать другую технику квотирование, е. г. двойные кавычки для частей, содержащих одиночные кавычки (помните, чтобы избежать $ в нем, в противном случае расширение происходит):

's/%2$u/<ph name='"'NUMBER'"' ex='"'%2\$u'"'\/>/g' 

Или использовать двойные кавычки внутри заменяемой строки, если это применимо:

's/%2$u/<ph name="NUMBER" ex="%2$u"\/>/g'