Как использовать sed с круглыми скобками?

И Perl и Python (и вероятно Ruby также) имеют простые наборы, которые можно использовать для быстрого создания простых Прокси HTTP.

В Perl используйте HTTP::Proxy. Вот пример с 3 строками из документации. Добавьте фильтры, чтобы отфильтровать, зарегистрировать или переписать запросы или ответы; см. документацию для примеров.

use HTTP::Proxy;
my $proxy = HTTP::Proxy->new( port => 3128 );
$proxy->start;

В Python используйте SimpleHTTPServer. Вот некоторый пример кода, слегка адаптированный от effbot. Адаптируйтесь do_GET метод (или другие) для фильтрации зарегистрируйте или перепишите запросы или ответы.

import SocketServer
import SimpleHTTPServer
import urllib
class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        self.copyfile(urllib.urlopen(self.path), self.wfile)
httpd = SocketServer.ForkingTCPServer(('', 3128), Proxy)
httpd.serve_forever()

4
28.06.2013, 13:58
3 ответа

( не специальный символ в sed регулярных выражениях. Вы не должны выходить из него.

sed -e 's/jQuery(function/head.ready(function/g'

[(] в regex означает набор символов, содержащий всего один элемент, (. Это - замысловатый способ записать (.

[(] в тексте замены означает эти три символа [(]. Скобки не имеют никакого особого значения в тексте замены.

Можно постараться не повторять имя функции, если Вам нравится путем помещения его в группу. Группы разграничены круглой скобкой обратной косой черты.

sed -e 's/jQuery(\(function\)/head.ready(\1/g'

Остерегайтесь та Ваша замена будет также влиять jQuery(functionwithsuffix. Простой способ избежать этого состоит в том, чтобы использовать инструмент, который понимает расширенные регулярные выражения Perl, таким образом, можно использовать (?![^A-Za-z0-9_]) в конце строки поиска, означая “сопровождаемый чем-то, что не является буквенно-цифровым знаком”. Обратите внимание на это в регулярных выражениях Perl, ( является особенным, необходимо снабдить префиксом его обратную косую черту.

perl -pe 's/jQuery\(function(?![^A-Za-z0-9_])/head.ready(function/g'
perl -pe 's/jQuery\((function)(?![^A-Za-z0-9_])/head.ready($1/g'
11
27.01.2020, 20:47
  • 1
    Являются ли parens литеральными, или не отличается между sed диалекты, хотя это должно быть корректно для большинства платформ. Существует только один Perl, таким образом, альтернатива Perl могла бы закончить тем, что была самой простой при необходимости в портативном решении (хотя даже затем Вам нужно другое заключение в кавычки, если необходимо быть портативными к Windows)-: –  tripleee 28.06.2013, 08:36
  • 2
    @tripleee, Какая причудливая sed реализация не реализует BRE (под которым круглые скобки являются литеральными)? Конечно, не историческая реализация Unix, ни любой из главных современных (BSD, GNU, BusyBox, …). –  Gilles 'SO- stop being evil' 28.06.2013, 12:29
  • 3
    Извините, я был перепутан.)-: –  tripleee 29.06.2013, 06:11
  • 4
    ) подобный ( ? –  Timo 28.12.2017, 13:56

Нет никакой потребности выйти из скобок в замещающей строке.

sed -e 's/jQuery[(]function/head.ready(function/g'
2
27.01.2020, 20:47
  • 1
    я должен заменить: jQuery (функционируют с head.ready (функция.... я думал, что должен был выйти" (" включением скобок вокруг этого... –  Tegan Snyder 28.06.2013, 02:14

(является специальным символом в sed, если используется расширенное регулярное выражение(ERE).

Например, sed -eзавершится с ошибкой Несопоставленная ошибка , когда по какой-либо причине )нужно выйти из круглых скобок (, но запустить sed без указания ЭРЭ:

$ regex="\("; echo "...(..." | sed 's/'$regex'/_/g'
sed: -e expression #1, char 8: Unmatched ( or \(

$ regex="\("; echo "...(..." | sed -e 's/'$regex'/_/g'
sed: -e expression #1, char 8: Unmatched ( or \(

В таком случае вам придется использовать sed с опцией -E(или -r, --regexp-extended):

.
$ regex="\("; echo "...(..." | sed -E 's/'$regex'/_/g'
..._...

$ regex="\("; echo "...(..." | sed -r 's/'$regex'/_/g'
..._...
2
17.05.2020, 16:19

Теги

Похожие вопросы