Цветная линия, но не отображать соответствующий шаблон [закрыто]

La opción -execa findejecuta una utilidad externa, posiblemente con alguna opción de línea de comando y otros argumentos.

Su Unix no proporciona cdcomo una utilidad externa, solo como un shell integrado -, por lo que findno puede ejecutarlo. Al menos macOS y Solaris proporcionan cdcomo una utilidad externa.

Sería poco o nada útil ejecutar cdde esta manera, excepto como una forma de probar si el nombre de ruta encontrado por findes 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 cden él usando ese enlace en su lugar:

find. -inum 888696 -exec ln -s {} thedir ';'

Esto crearía un enlace simbólico llamado thedirque 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.

-1
17.06.2019, 00:14
3 ответа

Измените строку sedна эту:

sed -ue 's/\(.*UNIVERSE.*\)/'${boldred}'\1'${norm}'/g'

с .*UNIVERSE.*, вы сопоставляете любую целую строку, содержащую UNIVERSE; затем вы добавляете круглые скобки :\(.*UNIVERSE.*\), чтобы зафиксировать совпадение (всей строки в данном случае ), а затем вы ссылаетесь на свое предыдущее совпадение с помощью \1.

1
28.01.2020, 05:09

Так и надо:

  1. совпадение строк, содержащих вашу строку поиска/UNIVERSE/
  2. удалите ненужные детали
  3. заменить начало (^)на${boldred}
  4. заменить конец($)на${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
    }'
0
28.01.2020, 05:09

Строка 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}/"
0
28.01.2020, 05:09

Теги

Похожие вопросы