2012-04-03 2 views
0

На прошлой неделе я случайно вытеснил все мои строки проекта моего затмения. Мне нужно вернуть это, и моя единственная надежда - это sed. Я пытался создавать скрипты, но не смог, потому что я новичок в sed, и это было бы очень сложной операцией. Что мне нужно сделать, так это:Поиск и замена с помощью sed

Строки в формате class.java файл в данный момент в следующем формате (метод) Messages.getString(<key>). Пример:

if (new File(DataSource.DEFAULT_VS_PATH).exists()) { 
     for (int i = 1; i <= c; i++) { 
      if (!new File(DataSource.DEFAULT_VS_PATH 
        + Messages.getString("VSDataSource.89") + i).exists()) { //$NON-NLS-1$ 
       getnewvfspath = DataSource.DEFAULT_VS_PATH 
         + Messages.getString("VSDataSource.90") + i; //$NON-NLS-1$ 
       break; 
      } 
     } 
    } 

Ключ и соответствующие строки в файле messages.properties в следующем формате.

VSDataSource.92=No of rows in db = 
VSDataSource.93=Verifying db entry : 
VSDataSource.94=DB is open 
VSDataSource.95=DB is closed 
VSDataSource.96=Invalid db entry for 
VSDataSource.97=\ removed. 
key=string 

Так что я нужен файл Java назад в этом формате:

if (new File(DataSource.DEFAULT_VS_PATH).exists()) { 
     for (int i = 1; i <= c; i++) { 
      if (!new File(DataSource.DEFAULT_VS_PATH 
        + "String 2" + i).exists()) { //$NON-NLS-1$ 
       getnewvfspath = DataSource.DEFAULT_VS_PATH 
         + "String 1" + i; //$NON-NLS-1$ 
       break; 
      } 
     } 
    } 

Как я могу сделать это с sed? Или есть более простой способ?

+1

Так что я предполагаю, '' VSDataSource.89' является String, 2' в файле 'messages.properties'? Вы хотите заменить 'Messages.getString ('VSDataSource.xxx')' на 'yyy' из' VSDataSource.xxx = yyy' в 'messages.properties'? –

+0

@ Mathematical.coffee да. «Key» не нужно начинать с 'VSDataSource', но он уникален для каждой строки. –

+0

Использовать Java? Вот что похоже: http://stackoverflow.com/questions/4766602/un-externalize-strings-from-eclipse-or-intellij. Вместо того, чтобы создавать строки в файле Java, вы можете просматривать все файлы и выполнять поиск и замену регулярных выражений. –

ответ

3

Это может работать для вас (GNU СЭД):

sed 's|^\([^=]*\)=\(.*\)|[email protected]("\1")@"\2"@g|;s/\\/\\\\/g' messages.properties | 
sed -i -f - *.java 
+0

Ницца. Я бы предложил -i.bak или что-то еще, только для двойной проверки позже. –

+0

'OSListActivity.100 =/system/bootmenu/recovery/sbin/tune2fs -j' В message.properties есть много таких записей. Так sed: file - строка 52: неизвестная опция 's ' –

+0

Просто измените' s /../../ g' на какое-нибудь решение '' @ .. @ .. @ g'. Вы также можете запустить первую часть и проверить скрипт сгенерированный командой вручную, когда он счастлив сохранить его как 'temp.sed' и запустить' sed -f temp.sed * .java' – potong

-1

Вам ничего не нужно программировать. Щелкните правой кнопкой мыши один из ваших измененных файлов и выберите «Заменить с помощью», «Предыдущая из локальной истории». При необходимости повторите.

+0

Пожалуйста, прочитайте первую строчку вопроса. Я несколько раз менял код после экстернализации. С историей почти невозможно заменить. –

+0

Это будет строка, которая говорит на прошлой неделе, что вы случайно вытеснили ваши строки в своем проекте eclipse? Это только вторник, вы знаете ... – phatfingers

+0

: D это смешно, я сделал это в последний понедельник. –

2

Чтобы повторить мой комментарий по этому вопросу - я думаю, что Java проблемы лучше решать в Java :) Хотя это, возможно, является проблемой Eclipse, помогли вызванные вами :)

сделать программу Java, в которой вы можете :

  • Прочитайте свойства,
  • Traverse все ваши .java файлы проекта,
  • Для каждого файла:
    • Read eà ch file line by line,
    • Замените все строки с помощью регулярных выражений, используя загруженные свойства,
    • Сохраните, когда закончите читать все строки.

Не 2 минут работы, но достаточно легко.

Но если вы действительно хотите использовать СЭД;)

mkt.sh

$ cat mkt.sh 
# Test structure 
rm -rf a b 
mkdir a 
mkdir b 
cat > a/A.java <<EOF 
my plans for replace 
this will be left alone 
EOF 
cat > b/B.java <<EOF 
propery ginger 
broccoli tomato potato 
EOF 

display() { 
    for i in a/A.java b/B.java; do 
    echo --- $i 
    cat $i 
    done 
} 

display 

# Prop change 
echo 'echo --- Replacing in: $1' > replace.sh 
sed -r 's/([^=]+)=(.+)/sed -i '\''s#\1#\2#'\'' $1/' sample.properties >> replace.sh 
chmod u+x replace.sh 

# Replace 
find -type f -name "*.java"|xargs -n1 ./replace.sh 

# Test 
display 

Run:

$ ./mkt.sh 
--- a/A.java 
my plans for replace 
this will be left alone 
--- b/B.java 
propery ginger 
broccoli tomato potato 
--- Replacing in: ./a/A.java 
--- Replacing in: ./b/B.java 
--- a/A.java 
my plans for world domination 
this will be left alone 
--- b/B.java 
propery ginger 
steak tomato potato 

Это должно работать правильно на ваших файлов .java, но сделать сделайте копию раньше;) У вас возникнут проблемы, если в строках есть #, но вы можете решить эту проблему, удалив их из файла свойств, выполнив заменить, в результате чего их обратно и изменить эту строку:

sed -r 's/([^=]+)=(.+)/sed -i '\''s#\1#\2#'\'' $1/' sample.properties >> replace.sh 

до т.д .:

sed -r 's/([^=]+)=(.+)/sed -i '\''s+\1+\2+'\'' $1/' sample.properties >> replace.sh 

где + не остающаяся характер. Немного хлопот, но ...

Надеюсь, это поможет.

+0

У меня проблемы с работой. http://pastebin.com/nWMCHEFF –

+0

Можете ли вы дать мне несколько (случайные строки из тех, которые имели ошибку) из сгенерированного файла replace.sh (и/или вашего файла свойств, если это возможно)? –

+0

Кроме того - какая ОС, версия bash, версия sed?Это может быть очень важно, поскольку некоторые из них не поддерживают параметры (например, '-r', заданные' sed' или тому подобное) –

2

makesed.awk:

BEGIN { 
    FS="="; 
    print "for i in *.java" 
    print "do" 
    print "sed \\" 
} 

{ 
    msg = "Messages.getString(\"" $1 "\")"; 
    gsub("/","\\/",$2); 
    print "-e 's/" msg "/\"" $2 "\"/g' \\" 
} 

END { 
    print "$i > $$" 
    print "mv $$ $i" 
    print "done" 
} 

Пробег:

awk -f makesed.awk yourpropertiesfile.dat > process.sh 

Это дает вам скрипт:

for i in *.java 
do 
sed \ 
-e 's/Messages.getString("VSDataSource.92")/"No of rows in db "/g' \ 
-e 's/Messages.getString("VSDataSource.93")/"Verifying db entry : "/g' \ 
-e 's/Messages.getString("VSDataSource.94")/"DB is open"/g' \ 
-e 's/Messages.getString("VSDataSource.95")/"DB is closed"/g' \ 
-e 's/Messages.getString("VSDataSource.96")/"Invalid db entry for "/g' \ 
-e 's/Messages.getString("VSDataSource.97")/"\ removed."/g' \ 
$i > $$ 
mv $$ $i 
done 

Затем перейти в свой соответствующих Java каталогов и запустить:

sh process.sh 

Это «исправит» все java-файлы в этом каталоге.

Если ваш файл свойств длинный, вы можете очень хорошо зайти в лимит командной строки с помощью sed. Просто разделите файл на куски, пока сценарий не станет счастливым.

Очевидно, что это не работает с любым символом эвакуации, если у вас есть «=» в ваших сообщениях, вы также будете испытывать некоторую боль. Если вы достаточно глупы, чтобы запускать это по коду, который не поддерживается, вы, безусловно, заслуживаете того, что с вами происходит.

Но это должно быть хорошим началом.

+0

"sed: -e выражение # 52, char 46: неизвестный параметр' s '"http://pastebin.com/bCVrL2Vy –

+0

Я добавил gsub, чтобы избежать каких-либо/в заменяющем тексте. Это вызывает проблемы. Попробуйте это, чтобы увидеть, работает ли он. –

+0

Некоторые записи не заменяются, иначе скрипт работает нормально. :) –

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