Применение regex к stdin

Если Вы желаете изменить свои цвета в консоли, которая является внешняя X, то можно указать, раскрашивает Ваш .bashrc, как так:

if [ "$TERM" = "linux" ]; then
    echo -en "\e]P0222222" #black
    echo -en "\e]P8222222" #darkgrey
    echo -en "\e]P1803232" #darkred
    ....
    fi

Где Вы определяете черный как #222222 См. это сообщение для деталей: http://phraktured.net/linux-console-colors.html

Если Вы работаете в X, то можно настроить установку путем определения цветов в Вашем .Xresources как так:

!black
 *color0:  #3D3D3D
 *color8:  #5E5E5E
!red
 *color1:  #8C4665
 *color9:  #BF4D80
 ...

и затем получая этот файл, когда Вы запускаете X, обычно от Вашего .xinitrc:

xrdb -merge ~/.Xresources

Wiki Дуги имеет страницу на.Xresources, который объясняет все опции: https://wiki.archlinux.org/index.php/Xresources

Другое улучшение Вы можете сделать или в X или не должны указать все различные типы файлов, что требуется окрасить — и их соответствующие цвета в a .dir_colors файл, как так:

.xinitrc       01;31 
.Xauthority    01;31
.Xmodmap       00;31
.Xresources    01;33
 ...

Для начала работы скопировать /etc/dir_colors Вашему пользователю /home каталог и вносит Ваши изменения. Затем получите это от Вашего .bashrc с eval $(dircolors -b ~/.dir_colors) Это позволит Вам мелкомодульное управление цветами файлов и типов файлов, когда Вы будете использовать ls.

Можно найти (невероятно подробный и полный) .dir_colors файл в качестве примера здесь: https://github.com/trapd00r/LS_COLORS/blob/master/LS_COLORS

С комбинацией всех трех подходов можно создать довольно универсальную установку, работаете ли Вы в консоли или в X.

5
29.10.2010, 10:47
4 ответа

Для простого использования можно сделать это как это:

newText=${text/SEARCH/replacement}

как это описано здесь, но для более сложных выражений sed является способом пойти как alex описанный ранее.

6
27.01.2020, 20:32

Самый простой ответ является sed's s команда. Необходимо преобразовать regexp синтаксис в Основные регулярные выражения, и замена будет применена последовательно на каждой строке. Можно использовать \1 через \9 относиться к заключенным в скобки группам в исходной строке. Добавьте g модификатор для замены всех случаев; в других отношениях только первое вхождение заменяется.

sed -e 's/basic regexp/replacement string/g'

Более гибкая утилита является awk. Это также обрабатывает свой вход линию за линией по умолчанию, но можно изменить разделитель записей с -vRS=… (стандарт awk хочет, чтобы отдельный символ или пустое значение означал две или больше новых строки; Простофиля (версия GNU) принимает регулярное выражение). sub функция выполняет единственную замену, и gsub замены все происшествия. Замещающая строка интерпретируется буквально за исключением \ и &; если Вы хотите обратиться к заключенным в скобки группам, можно использовать match и subtring функции.

awk '{gsub(/regexp/, "replacement string")}'

Bash имеет встроенную поддержку соответствия regexp: [[ text =~ regexp ]]. Можно создать текст замены с помощью подобранных подстрок, сохраненных в BASH_REMATCH массив. Использовать read или cat получить вход и printf испускать вывод. Следующий псевдокод выполняет несколько замен (предупреждение, непротестированное; код, как предполагается, выполняет несколько замена слева направо, как обычно, я надеюсь, что разобрался в нем).

# The end marker must not have a prefix that is a suffix of a match of the regexp,
# and must not start or end with a newline
end_marker='EOF'
text=$(cat; echo "$end_marker")
while [[ $text =~ regexp(.*)$ ]]; then
    printf %s%s "${text%"$BASH_REMATCH[0]"}" "replacement string"
    text=$BASH_REMATCH[$#BASH_REMATCH]
  fi
done
printf %s "${text%"$end_marker"}"

(Несколько слов объяснения: маркер конца должен постараться не запаздывать новые строки, разделяемые заменой команды. ${text%"$BASH_REMATCH[0]"} извлекает часть текста, который появился перед соответствием. Обратите внимание, что мы не можем использовать ^(.*) в начале regexp или мы получили бы последнее соответствие вместо первого. После соответствия мы выполняем итерации по суффиксу. Наконец мы печатаем несопоставленный остаток минус маркер конца.)

Если Вы удовлетворены подстановочным соответствием и ограниченными способностями к тексту замены, удар также имеет ${variable/pattern/replacement}. Удвойте первую наклонную черту для замены всех случаев. Шаблоны действительно имеют силу регулярных выражений (но с необычным синтаксисом) если extglob опция установлена.

6
27.01.2020, 20:32
  • man sed
  • sed s/regex/replacementString/g
4
27.01.2020, 20:32

можно использовать инструменты как sed и awk, но по-моему они являются очень устаревшими и только полезными для узко определенных задач.

лучшая ставка должна перенаправить STDIN к остроте жемчуга или сценарию. поддержка regex perl так хороша, что большинство других языков теперь поддерживает некоторую совместимость с ними. там ровны a2p и s2p инструменты для преобразования sed и awk непосредственно в жемчуг. использование жемчуга позволяет Вам использовать полноту CPAN, чтобы помочь Вам решить свои проблемы.

и если Вам не нравится жемчуг, можно использовать Python в подобной способности.

-1
27.01.2020, 20:32
  • 1
    Обеспечение примера улучшило бы Ваш –  Mene 07.03.2017, 17:44
  • 2
    awk полный по Тьюрингу язык программирования... Как это является узким?. sed вполне эффективный текстовый редактор. "Вытесненный" субъективная оценка, не мера уместности, уместности или возможности. –  Mario G. 03.08.2017, 04:36

Теги

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