Ну, я собирался сказать, делают это сценарием, потому что псевдонимы действительно не предназначены, чтобы сделать, сложные вещи как это и сценарии предназначены для более - сложные или более длинные выполняющиеся задачи. Псевдонимы в основном предназначены, чтобы отобразить одну команду на другого, например, предоставить параметры по умолчанию команде, которая не поддерживает это исходно.
Однако, так как Вы заявили в комментарии, что Вы хотите сохранить это псевдонимом, мы должны будем выяснить, как сделать то, что Вы хотите в границах псевдонима.
Естественный выбор затем становится для запуска подоболочки из псевдонима. Например:
~$ alias xyz1='( cd ~/tmp; sleep 10; cd ~ )'
~$ alias xyz2='cd ~/tmp; sleep 10; cd ~'
~$ xyz2
^C
~/tmp$ cd
~$ xyz1
^C
~$
Это изменяет рабочий каталог только в подоболочке, которая выходит, когда или псевдоним заканчивает выполняться обычно или прерывается, например, через Ctrl+C.
С недавним (для \K
и s///r
) perl
и предполагая, что ваши
метки не гнездятся:
perl -0777 -pi.bak -e's{<string.*?>\K.*?(?=</string>)}{$&=~s/-/–/rg}ges' file.xml
-0777
: slurp mode: обрабатывать весь файл сразу (чтобы теги
могли занимать несколько строк).-p
: sed
mode-i.bak
: редактирование на месте с расширением .bak
(BTW, именно оттуда некоторые реализации sed
получили эту идею)s{...}{..... }ges
: замена глобально (g
), где .
также совпадает с символами новой строки (s
), и рассматривает замену как код perl
для выполнения (e
).\K.*?
: совпадает с
до
, но не включайте сами теги в ту часть, которая соответствует (\K
определяет, где начинается соответствует порция, и (? =...)
является оператором поиска, который только проверяет, если строка>
есть, но не включает его в соответствие).$&=~s/.../.../rg
. Соответствует ли подстановка в части ($&
). Флаг r
на самом деле не изменять $&
, а возвращать подставленную строку. Если я правильно понял, вы хотите заменить все случаи (три в вашем примере) -
в тегах
и только эти случаи. Если это так, то эти подходы должны работать в предположении, что ваш XML вменяем:
Используйте регулярное выражение и простой инструмент типа sed
sed 's/\(]*>[^-]*\)-\([^-]*<\/string\)/\1\–\2/' file.xml.
Если ваш файл всегда, как в примере выше, и вы можете быть уверены, что ваши теги всегда будут <имя строки="test" >
, вы можете использовать lookbehinds:
perl-pe 's/(? <=)([^<]*?)-([^<]*)/$1–$2/g' file.xml
Ни одно из вышеперечисленного не сработает, если в тегах будет более одного -
. Чтобы справиться с такими случаями, можно написать простой маленький скрипт, который проверяет, находимся ли мы внутри тегов
. Это также должно касаться вложенных тегов.
perl -F'<' -lane 'for($i=0;$i<=$#F;$i++){
$a++ если $F[$i]=~/^string/;
$F[$i]=~s/-/–/g if $a>0;
$a-- если $F[$i]=~/^\/string/
} распечатайте join "<",@F' file.xml
Уф, через какое-то время я понял. Это наивное решение. ответ Тердона более правильный и вы должны использовать его хотя :).
sed -Ei.bak "s/(.*<string[^>]*\")(.*)-(.*)/\1\2\–\3/g" strings.xml
Я использую Обратные ссылки , чтобы вернуться к ранее сопоставленной строке. Это \ 1
\ 2
и т. Д.
В этом случае sed должен соответствовать следующим группам:
(. * ] * \ ")
- любой символы, за которыми следует строковый тег, открывающийся до кавычки "
. Группа 1 (. *)
- все, что находится после "
(включая прямо сейчас >
) до группы 3. Группа 2 -
соответствующий тире (. *)
- все, что находится после совпадающего тире Группа 3 Затем я заменяю его ранее сопоставленными группами и значением HTML тире -
, используя \ n
с n
в качестве ссылки на группу n
.
В настоящее время я пытаюсь исправить некоторые проблемы, так что, пожалуйста, справьтесь со мной:
dsfjpasj
>
> 1 -
или вложенные теги или теги, занимающие несколько строк »http://toytoygogie.blogspot.de/2010/02/using-sed-with -backreference-as.html