Да, это возможно. При использовании этих опций значение по умолчанию должно только распечатать каждую строку. Это является очень подробным, и не, что Вы хотите.
diff --unchanged-line-format=""
устранит строки, которые неизменны, поэтому теперь, только старые и новые линии продолжаются.
diff --unchanged-line-format="" --new-line-format=":%dn: %L"
теперь покажет новые строки, снабженные префиксом :<linenumber>:
и пространство, но все еще печатают старые строки. Принятие Вас хочет устранить их,
diff --unchanged-line-format="" --old-line-format="" --new-line-format=":%dn: %L"
Если Вы хотите, чтобы старые строки, а не новые были распечатаны, подкачайте их вокруг.
sed -i -E "s/(<username>.+)name(.+<\/username>)/\1something\2/" file.xml
Это, я думаю, что Вы ищете.
Объяснение:
\1
, \2
, и т.д. во второй части ссылки на i-th группу, полученную в первой части (нумерация запускается с 1),-E
включает расширенные регулярные выражения (необходимый для +
и группировка).sed -e '/username/s/CDATA\[name\]/CDATA\[something\]/' \
-e '/password/s/CDATA\[password\]/CDATA\[somethingelse\]/' \
-e '/dbname/s/CDATA\[name\]/CDATA\[somethingdifferent\]/' file.txt
/username/
перед s
говорит sed только работать над строками, содержащими строку 'имя пользователя'.
Если sed
не трудное требование, лучше используйте специальный инструмент вместо этого.
Если Ваш файл является допустимым XML (не только те 3 выглядящих словно XML тега), то можно использовать XMLStarlet:
xml ed -P -O -L \
-u '//username/text()' -v 'something' \
-u '//password/text()' -v 'somethingelse' \
-u '//dbname/text()' -v 'somethingdifferent' file.xml
Вышеупомянутое будет также работать в ситуациях, которые было бы трудно решить с регулярными выражениями:
Краткая демонстрация вышеупомянутого:
bash-4.2$ cat file.xml
<sith>
<master>
<username><![CDATA[name]]></username>
</master>
<apprentice>
<username><![CDATA[name]]></username>
<password>password</password>
<dbname foo="bar"><![CDATA[name]]></dbname>
</apprentice>
</sith>
bash-4.2$ xml ed -O -u '//apprentice/username/text()' -v 'something' -u '//password/text()' -v 'somethingelse' -u '//dbname/text()' -v 'somethingdifferent' file.xml
<sith>
<master>
<username><![CDATA[name]]></username>
</master>
<apprentice>
<username><![CDATA[something]]></username>
<password>somethingelse</password>
<dbname foo="bar"><![CDATA[somethingdifferent]]></dbname>
</apprentice>
</sith>
Необходимо заключить в кавычки \[.*^$/
в части регулярного выражения s
команда и \&/
в сменной детали, плюс новые строки. Регулярное выражение является основным регулярным выражением, и кроме того необходимо заключить разделитель в кавычки для s
команда.
Можно выбрать другой разделитель, чтобы избежать необходимости заключать в кавычки /
. Необходимо будет заключить тот символ в кавычки вместо этого, но обычно точка изменения разделителя должна выбрать тот, который не происходит или в тексте для замены или в текст замены.
sed -e 's~<username><!\[CDATA\[name\]\]></username>~<username><![CDATA[something]]></username>~'
Можно использовать группы, чтобы не повторить некоторые части в тексте замены и размещать вариацию на эти части.
sed -e 's~\(<username><!\[[A-Z]*\[\)name\(\]\]></username>\)~\1something\2~'
sed -e 's~\(<username>.*[^A-Za-z]\[\)name\([^A-Za-z].*</username>\)~\1something\2~'
Для замены слово "имени" с "чем-то" слово используйте:
sed "s/\(<username><\!\[[A-Z]*\[\)name\]/\1something/g" file.xml
Это собирается заменить все случаи указанного слова.
До сих пор все производится к стандартному выводу, можно использовать:
sed "s/\(<username><\!\[[A-Z]*\[\)name\]/\1something/g" file.xml > anotherfile.xml
сохранить изменения в другом файле.
$ sed -e '1s/name/something/2' \
-e '3s/name/somethingdifferent/2' \
-e 's/password/somethingelse/2' sample.xml
Вы можете просто использовать адреса, как в числе перед "s", которое указывает номер строки.
Также число в конце указывает sed
заменить второе совпадение вместо замены первого совпадения.
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
-r, --regexp-extended
use extended regular expressions in the script.
чтобы заменить значение в файле свойств
sed -i -r 's/MAIL\=(.+)/MAIL\=user@mymail.com/' etc/service.properties
(original name) + "-E"
. – Display Name 13.11.2015, 07:32\(
и\)
вместо(
и)
. – Zhang Buzz 12.11.2017, 15:56