Як замяніць радкі, якія ўтрымліваюць касую рысу з СЭД?

У мяне ёсць праект Visual Studio, які распрацаваны на мясцовым узроўні. Файлы кода павінны быць разгорнутыя на выдалены сервер. Адзіная праблема заключаецца ў URLsthey ўтрымлівае, якія жорстка закадавана.

Праект змяшчае URLS, такія як Старонка = адзін . Для спасылка сапраўдная на сэрвэры, ён павінен быць <�моцны>/старонка/адзін .

Я вырашыў замяніць усе URLS ў маім codefiles з SED перад разгортваннем, але я затрымаўся на касых чорт.

Я ведаю, што гэта не вельмі пасуе, але гэта проста выратавала б мяне шмат часу. Агульная колькасць радкоў, якія я павінен замяніць менш 10. агульная колькасць файлаў, якія павінны быць правераны складае ~ 30.

Прыклад апісанне майго становішча ніжэй:

Каманда, я выкарыстоўваю:

sed -f replace.txt < a.txt > b.txt

replace.txt, які змяшчае ўсе радкі:

s/?page=one&/pageone/g
s/?page=two&/pagetwo/g
s/?page=three&/pagethree/g

a.txt:

?page=one&
?page=two&
?page=three&

Змест b.txt пасля таго як я бягу маё SED каманды:

pageone
pagetwo
pagethree

Тое, што я хачу b.txt змяшчаць:

/page/one
/page/two
/page/three
99
дададзена аўтар tripleee, крыніца
дададзена аўтар Damien MATHIEU, крыніца

9 адказы

Прасцей за ўсё было б выкарыстоўваць іншы падзельнік ў вашым пошуку/замены радкоў, напрыклад.:

s:?page=one&:pageone:g

Вы можаце выкарыстоўваць любы знак у якасці падзельніка, які не з'яўляецца часткай любой радка. Ці вы маглі б пазбегнуць яго з дапамогай зваротнай касой рысы.

189
дададзена
Не можа быць прасцей, чым гэта. Дзякуй.
дададзена аўтар W.M., крыніца
Вялікі адказ! Вялікі дзякуй!
дададзена аўтар Romulus, крыніца

<�Код> s каманда можа выкарыстоўваць любы знак у якасці падзельніка; незалежна ад характару прыходзіць пасля s выкарыстоўваецца. Я быў выхаваны, каб выкарыстоўваць # . Як так:

s#?page=one&#/page/one#g
70
дададзена
Старонка людзей для BSD SED на OS X кажа аб <�я> s каманда: <�я> Замяніць радок замены для першага асобніка назваў паведамленняў у шаблоне прасторы. Любы сімвал, акрамя ўжыць зваротны слэш або сімвал новага радка можа быць выкарыстаны замест касой рысы, каб размежаваць RE і замены. Я б паставіў грошы, што старонка для GNU SED кажа нешта падобнае.
дададзена аўтар Tom Anderson, крыніца
Вельмі файна! Не падобна, каб быць у, хоць ... старонка кіраўніцтва
дададзена аўтар bk138, крыніца

Вельмі карысна, але менш вядомы факт аб тым, што СЭД знаёмы s/Foo/бар/ каманда можа выкарыстоўваць любы знак прыпынку, а не толькі касую рысу. Распаўсюджанай альтэрнатывай з'яўляецца s @ Foo @ бар @ , з якога становіцца ясна, як вырашыць вашу праблему.

46
дададзена
Genius савет, калі вы хочаце замяніць слэша. Дзякуй!
дададзена аўтар mbb, крыніца

дадаць \ перад адмысловымі знакамі

    s/\?page=one&/page\/one\//g

і г.д.

4
дададзена
Можа быць, я нешта прапусціў, але я паспрабаваў гэта, і гэта не падобна на працу. Гэта сапраўды здавалася відавочным, што трэба паспрабаваць, але пры ўмове, што я маю рацыю, і гэта на самай справе не працуе, таму размясціць яго?
дададзена аўтар codenoob, крыніца
@codenoob (а хто-то, хто атрымлівае тут) - «s» у пачатку патрабуецца. <�Код> s/Foo \/бар/foo_bar/ будзе працаваць, але /Foo \/бар/foo_bar/ не будзе.
дададзена аўтар MynockSpit, крыніца

гэтая лінія павінна працаваць для 3 прыкладаў:

sed -r 's#\?(page)=([^&]*)&#/\1/\2#g' a.txt
  • Я -r , каб захаваць некаторы выцяканне.
  • лінія павінна быць агульнай для аднаго, два тры выпадкі. Вы не павінны рабіць падлодку 3 разы

праверыць з вашым прыкладам (a.txt):

kent$  echo "?page=one&
?page=two&
?page=three&"|sed -r 's#\?(page)=([^&]*)&#/\1/\2#g'
/page/one
/page/two
/page/three
3
дададзена

У сістэме я развіваю, радок, якая будзе заменена СЭД з'яўляецца ўвод тэксту ад карыстальніка, які захоўваецца ў зменнай і перадаецца СЭД.

Як ужо адзначалася раней, на гэты пост, калі радок, якая змяшчаецца ў камандным блоку SED ўтрымлівае фактычны падзельнік, які выкарыстоўваецца SED - тады SED заканчваецца на сінтаксічнай памылкі. Разгледзім наступны прыклад:

Гэта працуе:

$ VALUE=12345
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
MyVar=12345

Гэта ламае:

$ VALUE=12345/6
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
sed: -e expression #1, char 21: unknown option to `s'

Замена падзельніка па змаўчанні не з'яўляецца надзейным рашэннем у маім выпадку, калі я не хачу, каб абмежаваць карыстальніка ад уводу адмысловых знакаў, якія выкарыстоўваюцца СЭД ў якасці падзельніка (напрыклад, "/").

Тым не менш, пазбегнуць якіх-небудзь уваходжанняў падзельніка ва ўваходны радку будзе вырашыць гэтую праблему. Разгледзім рашэнне ніжэй сістэматычнага ўцёкаў сімвала падзельніка ў радку ўводу да таго, яна аналізуецца СЭД. Такое экранаванне можа быць рэалізаваны ў якасці замены з выкарыстаннем СЭД сама гэтая замена з'яўляецца бяспечным, нават калі ўваходныя радок утрымлівае падзельнік - гэта, так як ўваходныя радок не з'яўляецца часткай каманднага блока SED:

$ VALUE=$(echo ${VALUE} | sed -e "s#/#\\\/#g")
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
MyVar=12345/6

Я ператварыў гэта функцыі, якія будуць выкарыстоўвацца ў розных сцэнарах:

escapeForwardSlashes() {

     # Validate parameters
     if [ -z "$1" ]
     then
             echo -e "Error - no parameter specified!"
             return 1
     fi

     # Perform replacement
     echo ${1} | sed -e "s#/#\\\/#g"
     return 0
}
3
дададзена

sed is the stream editor, in that you can use | (pipe) to send standard streams (STDIN and STDOUT specifically) through sed and alter them programmatically on the fly, making it a handy tool in the Unix philosophy tradition; but can edit files directly, too, using the -i parameter mentioned below.
Consider the following:

sed -i -e 's/few/asd/g' hello.txt

s/ is used to substitute the found expression few with asd:

<�Р> мала, адважны.      <�Ч>      <�Р> ASD, адважны. </Р>

/g stands for "global", meaning to do this for the whole line. If you leave off the /g (with s/few/asd/, there always needs to be three slashes no matter what) and few appears twice on the same line, only the first few is changed to asd:

<�Р> Некалькі мужчын, тыя нешматлікія жанчыны, адважныя.      <�Ч>      <�Р> АСД мужчына, нешматлікія жанчыны, адважныя.

Гэта карысна ў некаторых выпадках, як змяненне спецыяльных знакаў у пачатках радкоў (напрыклад, замена больш чым сімвалы некаторых людзі выкарыстоўваюць, каб цытаваць папярэдні матэрыял у электронных патоках з язычком гарызантальным, пакідаючы каціруемую алгебраічнай няроўнасць у канцы лініі некранутымі), але ў вашым прыкладзе, дзе вы паказваеце, што ў любым месцы некалькі адбываецца яго варта замяніць, пераканайцеся, што ў вас ёсць, што .

Наступныя два варыянты (сцягі) аб'ядноўваюцца ў адзін, -ie :

-i option is used to edit in place on the file hello.txt.

-e option indicates the expression/command to run, in this case s/.

Заўвага: Вельмі важна, што вы карыстаецеся -i -e для пошуку/замены. Калі вы -ie , стварыць рэзервовую копію кожны файл з літарай "е", прыкладзенай.

2
дададзена

Вялікі адказ ад Anonymous. \ Вырашыць маю праблему, калі я спрабаваў пазбегнуць двукоссяў у HTML-радкоў.

Так што калі вы выкарыстоўваеце СЕПГ, каб вярнуць некаторыя шаблоны HTML (на сэрвэры), выкарыстоўвайце падвойную зваротны слэш замест аднаго:

var htmlTemplate = "<div style=\\"color:green;\\"></div>";
1
дададзена

replace.txt should be

s/?page=/\/page\//g
s/&//g
1
дададзена