Поиск и замена с помощью sed

Поиск и замена с помощью sed

На прошлой неделе я случайно вынес все свои строки из проекта Eclipse. Мне нужно это вернуть, и моя единственная надежда — 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

«Хитрость» заключается в том, чтобы создать скрипт sed из message.properties:

$ sed 's!/!\\!;s!\([^=]*\)=\(.*\)!s/"\1"/"\2"/g!' message.properties > message.sed
$ sed -f messages.sed class.java > class.java.reverted
$ rm messages.sed

Вы начинаете с чего-то вроде:

VSDataSource.92=No of rows in db = 
VSDataSource.93=Verifying db entry : 
VSDataSource.NN=Foo/bar

И в итоге получается:

s/"VSDataSource.92"/"No of rows in db= "/g
s/"VSDataSource.93"/"Verifying db entry : "/g
s/"VSDataSource.NN"/"Foo\/bar"/g

решение2

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

#!/bin/bash
set -x
for i in `seq 92 97`
do
    X=$(sed -n s/^VSDataSource.$i=//p messages.properties)
    sed -i "s+Messages.getString(\"VSDataSource.`echo $i`\")+\"`echo $X`\"+g" class.java
done

Конечно, измените аргументы на seq и sed (*java вместо class.java, возможно). Но, если серьезно, это никак не может быть лучшим решением вашей проблемы. Если у вас есть кнопка «externalize strings», разве у вашей IDE не должно быть кнопки «internalize strings»?

Связанный контент