La opción -exec
a find
ejecuta una utilidad externa, posiblemente con alguna opción de línea de comando y otros argumentos.
Su Unix no proporciona cd
como una utilidad externa, solo como un shell integrado -, por lo que find
no puede ejecutarlo. Al menos macOS y Solaris proporcionan cd
como una utilidad externa.
Sería poco o nada útil ejecutar cd
de esta manera, excepto como una forma de probar si el nombre de ruta encontrado por find
es un directorio en el que podría cd
. El directorio de trabajo en su shell interactivo (o lo que sea que esté llamandofind
)no cambiaría de todos modos.
Relacionado:
Si tiene problemas con el nombre de un directorio que es extraño o extremadamente difícil de escribir, y desea cambiar a ese directorio, entonces considere crear un enlace simbólico al directorio y luego cd
en él usando ese enlace en su lugar:
find. -inum 888696 -exec ln -s {} thedir ';'
Esto crearía un enlace simbólico llamado thedir
que apuntaría al directorio problemático. Luego puede cambiar el directorio de trabajo con
cd thedir
(si el enlace existe en el directorio actual ). Esto evita modificar el directorio de cualquier forma. Otra idea sería renombrar el directorio de forma similar con find
, pero eso no sería recomendable si otro programa espera que el directorio tenga ese nombre en particular.
Измените строку sed
на эту:
sed -ue 's/\(.*UNIVERSE.*\)/'${boldred}'\1'${norm}'/g'
с .*UNIVERSE.*
, вы сопоставляете любую целую строку, содержащую UNIVERSE
; затем вы добавляете круглые скобки :\(.*UNIVERSE.*\)
, чтобы зафиксировать совпадение (всей строки в данном случае ), а затем вы ссылаетесь на свое предыдущее совпадение с помощью \1
.
Так и надо:
/UNIVERSE/
(^)
на${boldred}
$
)на${norm}
Вот предварительный фрагмент, который должен показать вам путь, основанный на опубликованных спецификациях:
norm="$(printf '\033[0m')"; boldred="$(printf '\033[0;1;31m')"; sed -ure "/UNIVERSE/{s/^[^ ]* //;s/\(UNIVERSE[^}]+}//;s/sagt:[^}]+}/sagt: /;s/^/${boldred}/;s/$/${norm}/}" input1
Или разделить для удобства чтения:
norm="$(printf '\033[0m')";
boldred="$(printf '\033[0;1;31m')";
sed -ure "/UNIVERSE/ {
s/^[^ ]* //;
s/\(UNIVERSE[^}]+}//;
s/sagt:[^}]+}/sagt: /;
s/^/${boldred}/;
s/$/${norm}/
}"
Я также предоставляю полное, автономное -Perl-решение:
perl -pe 'BEGIN{use Term::ANSIColor qw(:constants)} if(/UNIVERSE/){s/^\S*\s//;s/\(UNIVERSE[^}]+}//;s/sagt:[^}]+}/sagt: /;$_=RED.$_.RESET}'
Или разделить для удобства чтения:
perl -pe 'BEGIN {use Term::ANSIColor qw(:constants)}
if (/UNIVERSE/) {
s/^\S*\s//;
s/\(UNIVERSE[^}]+}//;
s/sagt:[^}]+}/sagt: /;
$_ = RED. $_. RESET
}'
Строка sed
в этом фрагменте соответствует строке UNIVERSE
, а затем атрибуты red
+ bold
применяются ко всей строке. Я использовал tput
для получения значений атрибутов, потому что они адаптируются в зависимости от типа терминала (, в том числе там, где он не установлен, например, в задании cron
):
# See "man 5 terminfo" for other portable settings
red=$(tput setaf 1 2>/dev/null)
bold=$(tput bold 2>/dev/null)
norm=$(tput sgr0 2>/dev/null)
# Perform the substitution
sed -e "/UNIVERSE/s/^.*$/${red}${bold}&${norm}/"