2012-02-09 3 views
2

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

У меня есть файл с кучей текста, в котором появляются URL-адреса. Все URL-адреса находятся в следующем формате: http://goo.gl/abc23 (это goo.gl/, а затем 4 ИЛИ 5 буквенно-цифровых символов).

Что бы я хотел сделать, это добавить строку ко всем URL-адресам. http://goo.gl/abc23 станет http://goo.gl/abc23?AString, http://goo.gl/JB007 станет http://goo.gl/JB007?AString и так далее.

Я пробовал это последние 3 часа и никуда не уходил. Я уверен, что это не очень сложно.

Я пробовал с sed (поиск и замена) и регулярное выражение, но я не знаю, как просто присоединить к строке, а не заменять ее. Я не очень хорошо разбираюсь в bash или regex.

Может ли кто-нибудь мне помочь? Любая помощь будет принята с благодарностью.

+0

Есть ли какое-то разделитель после URL-адресов? – Toto

ответ

2

С помощью sed вашей методологией было бы «заменить текущую строку на текущую строку плюс другую». Так что, если вы имели некоторое регулярное выражение, чтобы соответствовать всем вашим URL-адресов (так как я не хочу, чтобы написать один на лета):

sed 's/myregex/&?AString/g' myfile.txt 

Вы бы все регулярное выражение вместо myregex. Символ & помещает всю согласованную строку с правой стороны, а остальная часть правой части подстановки добавляет ?AString. g в конце говорит sed, чтобы заменить все экземпляры на строке, а не только на первый.

+0

Удивительно, это работает. Я не знал о &. Я продолжал пытаться с $ и $ 1 и тому подобное. – zigamilek

+0

Теперь, есть способ добавить к каждой строке другую строку? Предположим, у меня есть функция 'generatestring', которая каждый раз меняет другую строку. Если я назову его с помощью 'sed 's/http: \/\/goo.gl \ /...../&? $ (Generatestring)/g" ', он (предположительно) будет записывать одну и ту же строку каждый раз. Любые идеи о том, как я могу писать разные строки после каждого раза? – zigamilek

+0

@ user1199569 Если строка не получена из строки, которую вы добавляете (т. Е. Подмножества или чего-то еще), я не уверен, как вы могли бы без команды 'sed'. Если бы это было так, «perl» мог бы быть способом. Это, как говорится, ткнуть в него, и если вы не можете понять это, отправьте отдельный вопрос к SO! ;) –

0

Perl-способ сделать это, предполагая, что URL-адрес заканчивается пробел:

perl -pne 's#(http://\S+)#$1?AString#g' input_file 
+0

с perl, вам не нужны скобки для захвата, если вы используете '$ &' вместо '$ 1' –

0

Вы можете использовать sed заменить конец строки ($):

sed 's/$/?AString/' input.txt 
Смежные вопросы