Я изменил к лучшему @user-unknown's решение немного путем сохранения текущего dir, выполнения произвольного теста, затем восстановления исходного dir прежде, чем возвратиться с ответом. Это более гибко, потому что можно протестировать на что-либо.
Я также предусматриваю дополнительный второй аргумент, который говорит, как высоко пойти.
https://gist.github.com/1577473
#!/bin/bash
# Use this script instead of ~/.rvm/bin/rvm-prompt
# and the output of rvm-prompt will show up in your command prompt
# only if you are in a Ruby project directory.
# see http://stackoverflow.com/a/4264351/270511
# and http://unix.stackexchange.com/questions/13464/is-there-a-way-to-find-a-file-in-an-inverse-recursive-search
upsearch () {
the_test=$1
up_to=$2
curdir=`pwd`
result=1
while [[ "`pwd`" != "$up_to" && "`pwd`" != '/' ]]; do
if eval "[[ $the_test ]]"; then
result=0
break
fi
cd ..
done
cd $curdir
return $result
}
if upsearch '-e Gemfile || ! -z "$(shopt -s nullglob; echo *.gemspec *.rb)"' ; then
~/.rvm/bin/rvm-prompt
fi
Предположение, что каждое возникновение *some text*
находится на одной строке (т.е. не разделение через несколько строк):
sed -r 's/\*([^*]+)\*/{\\i \1}/g' file
С любым POSIX sed
, и если *...*
может охватить несколько строк, Вы могли сделать:
sed -e :1 -e 's/\*\([^*]\{1,\}\)\*/{\\i \1}/g;/\*/!b' -e '$q;N;b1'
Обратите внимание что некоторые sed
реализации имеют относительно низкий предел на размер их пространства шаблона, таким образом, они могут перестать работать если *...*
охватите слишком много (длинных) строк.
С жемчугом:
perl -0777 -pe 's/\*(.*?)\*/{\\i $1}/gs'
Но остерегайтесь этого, это хлебает целый файл в памяти до выполнения замен, которые могли быть проблемой для огромных файлов. Также отметьте это perl
имеет a -i
опция обновить файл на месте (который некоторые sed
реализации одолжили),
sed
Вы используете. Я получаю тот же вывод с\\\i
как с\\i
. Я использую 'GNU sed версия 4.2.1' – Peter.O 25.01.2013, 16:47