2015-12-02 4 views
0

У меня есть файл, содержащий более 14000 записей. Что я хочу сделать, это обработать этот файл по строкам и заменить строку String на строку anodher, возвращаемую командой grep. Например: Line:для каждой строки файла, grep определенная строка и подстановка строки

/xxxxx/xxxxx/Class.java:67: Logger.w(TAG, "message"); 

Моя команда Grep, чтобы получить Class.java строка (Class.java является Жюст пример):

grep -o '[a-zA-Z]*"*\.java"*' 

Я должен, для каждой строки, заменить TAG строку в class.java строки возврата по команде Grep

+0

Вы должны 'sed' вместо' grep'. – Maroun

+0

Можете ли вы опубликовать пример вывода для двух разных файлов? неясно, нужен ли вам буквальный 'class.java', или это строка, полученная из обработанного имени файла (и это означает, что оно должно быть обрезанным?) –

+0

Class.java - это просто пример. У меня есть, например, MainActivity.java LoginActivity.java и т. Д. –

ответ

1

Вы можете использовать sed и выполните следующие действия:

sed -r 's#(.*)/(.*)\.java(.*)(TAG)#\1\/\2\3\2#g' 

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

Для того, чтобы изменить файл в месте, вы должны:

sed -ir 's#(.*)/(.*)\.java(.*)(TAG)#\1\/\2\3\2#g' your_file.txt 
+0

, первая команда отлично работает, и в моем терминале я вижу, что все строки TAG заменяются правильным классомName, но в выходных файлах строки TAG остаются теми же. Вторая команда (whitch Мне нужно) возвращает ошибку: sed: -e выражение n ° 1, caractère 39: référence \ 3 invalide dans le côté droit de la commande 's ' \ 3 ссылка не валид справа а я не могу понять это –

+0

Я хочу поблагодарить вас за ваш ответ. Наконец я работал с первой командой и сохранял результаты, увиденные в stdout, в файл :) –

+0

@ diego-bf Я рад, что это вам помогло. Я не могу понять ошибку, которую вы получаете, это не английский. – Maroun

1

Это ж здесь СЭД приходит в:

sed -i 's/TAG/class.java/g' Class.java 

сделать это для всех файлов Java в текущем каталоге (предполагается, что Баш здесь):

sed -i 's/TAG/class.java/g' *.java 

-i средства в месте, так что замена происходит внутри файла и сохраняется немедленно. В остальном я предлагаю вам google о sed.

+0

Это почти правильно, вам просто нужно поддерживать '. * \. Java' вместо' class.java'. – Maroun

+0

@MarounMaroun thx. сделанный. Я не уверен, что это то, что нужно OP. –

+0

Ему нужно заменить TAG тем, что появляется перед '.java', ваш ответ по-прежнему не правильный. – Maroun

0

Вы можете использовать:

grep -rl 'old_string' ./ | xargs sed -i 's/old_string/Relacement_String/g' 
Смежные вопросы