Если StringB
и StringA
не может появиться на той же входной строке, затем можно сказать sed выполнять замену один путь и только пробовать другой путь, если не было никаких случаев первой искавшей строки.
<file.txt sed -e 's/StringA/StringB/g' -e t -e 's/StringB/StringA/g'
В общем случае я не думаю, что в sed существует легкий метод. Между прочим, обратите внимание, что спецификация неоднозначна если StringA
и StringB
может наложиться. Вот решение для Perl, которое заменяет крайнее левое возникновение любой строки и повторения.
<file.txt perl -pe 'BEGIN {%r = ("StringA" => "StringB", "StringB" => "StringA")}
s/(StringA|StringB)/$r{$1}/ge'
Если Вы хотите придерживаться инструментов POSIX, awk является способом пойти. Awk не имеет примитива для общих параметрических замен, таким образом, Вам нужно к самокрутке.
<file.txt awk '{
while (match($0, /StringA|StringB/)) {
printf "%s", substr($0, 1, RSTART-1);
$0 = substr($0, RSTART);
printf "%s", /^StringA/ ? "StringB" : "StringA";
$0 = substr($0, 1+RLENGTH)
}
print
}'
Найти исполняемые файлы названными java
в соответствии с указанным каталогом:
find '/Applications/NetBeans/NetBeans 7.0.app/' -name java -type f -perm -u+x
Вывод будет одним именем файла на строку, например.
/Applications/NetBeans/NetBeans 7.0.app/Contents/Resources/NetBeans/ExecutableJavaEnv/java
Если Вы хотите опустить …/NetBeans 7.0.app
часть, сначала переключитесь на каталог и работайте find
на текущем каталоге (.
). Все еще будет a ./
префикс.
cd '/Applications/NetBeans/NetBeans 7.0.app/'
find . -name java -type f -perm -u+x
Строго говоря, -perm u+x
выбирает все файлы, которые являются исполняемым файлом их владельцем, не всеми файлами, которые можно выполнить. GNU находит, имеет a -executable
опция искать файлы, которые Вы имеете, выполняет разрешение на, принимая во внимание все режимы файла и ACLs, но эта опция не доступна в других системах, таких как OSX. На практике это вряд ли будет иметь значение; на самом деле для Вашего варианта использования можно забыть о полномочиях в целом и просто соответствовать -name java -type f
.
-type f
выбирает только регулярные файлы, не каталоги или символьные ссылки. Если Вы хотите включать символьные ссылки на регулярные файлы в поиске, добавьте -L
опция к find
(сразу после find
команда, перед названием каталога для поиска).
Я думаю, что это - то, что Вы хотите:
find /Applications/NetBeans/NetBeans\ 7.0.app -type f -executable -name java
. find /Applications/NetBeans/NetBeans\ 7.0.app -type f -executable -name java find: -executable: unknown option
Я должен изменить опции после того, как найдут? Но это - все еще ошибка.
– Arie
23.07.2011, 15:17
-executable
характерно для GNU, находят. В Вашем случае просто пропустите его.
– Gilles 'SO- stop being evil'
23.07.2011, 15:33
Кажется, что это может быть, легко покончили, найдите: find /path/ -name java
. (Почему Вы не попробовали).
find /opt/experiment/ruby/ -name ruby -type f -perm -u+x
дает мне это/opt/experiment/ruby//bin/ruby
. Для файла Java я ищу в ENV NB, я обновил свой вопрос на SU, надо надеяться, кто-то знакомый с NetBeans и Java подойдет. Спасибо парни, все Вы, желая я мог upvote, Ваши ответы, все просвещали мой день. – Arie 23.07.2011, 15:56