2016-10-19 2 views
0

Я пытаюсь заменить все вхождения строки:заменить все вхождения строки

https://support.office.com/en-us/article/Check-for-accessibility-issues-a16f6de0-2f39-4a2b-8bd8-5ad801426c7f?ui=en-US&rs=en-US&ad=US 

с xyz. Это должно быть сделано для всех файлов в текущем каталоге.

Я использовал следующую команду:

find . -type f | xargs sed -i 's/https\:\/\/support\.office\.com\/en\-us\/article\/Check\-for\-accessibility\-issues\-a16f6de0\-2f39\-4a2b\-8bd8\-5ad801426c7f\?ui\=en\-US\&rs\=en\-US\&ad\=US/xyz/g'; 

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

Прямо сейчас, я префикс каждого не-буквенно-цифрового символа \.

ответ

1

СЕПГ по умолчанию использует BRE, вы избежали некоторых символов, которые дали свое особое значение в BRE, например, \? не означают буквальное ?, а, значит, zero or one occurrence

Вы должны корректировать свои побеги .. или используйте разделитель, отличный от / в sed.

...sed '[email protected]://[email protected]@g` 
+0

@anukul, вы должны посмотреть, что такое специальные символы в BRE. Я думаю, что в вашем примере вам просто нужно избежать '.' (точка) – Kent

+0

Хорошо, и как сменить разделитель? – anukul

+0

@anukul последний код строки в моем ответе - это пример, я выбрал '@'. это по умолчанию '/', вам нужно избегать всех косых черт, я думаю, что у вас много в веб-URL. – Kent

2

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

Попробуйте эту команду:

find . -type f -exec sed -i 's~https://support\.office\.com/en-us/article/Check-for-accessibility-issues-a16f6de0-2f39-4a2b-8bd8-5ad801426c7f?ui=en-US&rs=en-US&ad=US~xyz~g' '{}' + 

Даже ? не нужно экранировать в BRE, как это соответствует буквального ?.

+0

Хорошо, это сработало. Но какие все персонажи мне нужно бежать сейчас? – anukul

+0

Вам нужно сбежать '[*. ]^$ 'и т. д. – anubhava

1

Если perl нормально, проверьте quotemeta

$ cat ip.txt 
https://support.office.com/en-us/article/Check-for-accessibility-issues-a16f6de0-2f39-4a2b-8bd8-5ad801426c7f?ui=en-US&rs=en-US&ad=US 

$ perl -pe 's|\Qhttps://support.office.com/en-us/article/Check-for-accessibility-issues-a16f6de0-2f39-4a2b-8bd8-5ad801426c7f?ui=en-US&rs=en-US&ad=US|xyz|' ip.txt 
xyz 


И использовать exec вариант вместо xargs

find -type f -exec perl -i -pe 'print "$ARGV" if s|\Qhttps://support.office.com/en-us/article/Check-for-accessibility-issues-a16f6de0-2f39-4a2b-8bd8-5ad801426c7f?ui=en-US&rs=en-US&ad=US|xyz|' {} + 
+0

Что делать, если '|' является частью URL-адреса? – anukul

+0

вам придется избегать этого. 'Echo 'as | asd' | perl -pe '| \ Qs \ | a | xyz |' ' – Sundeep

0

пытались его оно не работает

СЕПГ «s @ WP-содержание/плагин с/BWP-Minify/мин /? F = WP-содержание/плагины/доля-это/CSS/style.css, WP-содержание/плагины/WP-к-щебета/CSS/Twitter-feed.css, WP-содержание /themes/yourgarden/style.css,wp-content/plugins/cleverness-to-do-list/css/cleverness-to-do-list-frontend.css,wp-content/plugins/cleverness-to-do-list /css/jquery-ui-fresh.css?wp-content/css/[email protected] ' sed: -e выражение # 1, char 344: команда unterminated `s'

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