Оболочка Unix: подстрока с регулярным выражением [закрыта]

Esto es lo que sucedió :Estaba construyendo este programa a partir de las fuentes. Los mantenedores genios decidieron que:

  1. Todos se ejecutaban en la misma máquina y configuración de sistema operativo que ellos
  2. Necesitan poner todas sus configuraciones en su $HOME/.bashrcpara que puedan hacer suposiciones en los scripts de compilación.

Eso llenó mi .bashrcde export CC, export CXX, export C_INCLUDE_PATH, LD_PRELOADy más cosas. Y eso arruinó las cosas.

Lección aprendida :Siempre revise su ~/.profile, ~/.shrc, ~/.bashrc, ~/.bash_profile, ~/.login, ~/.bash_loginpara nuevas entradas extrañas.

-3
18.04.2019, 17:13
2 ответа

Стандартной командой для применения регулярных выражений к строковым аргументам является exprс оператором :. Он понимает стандартные основные регулярные выражения . Он выводит 1 или 0 в зависимости от того, соответствует ли регулярное выражение или нет, если регулярное выражение не имеет хотя бы одной группы захвата, и в этом случае он выводит то, что было сопоставлено первой группой захвата. Одной из особенностей exprв :является то, что регулярное выражение неявно привязывается к началу, как если бы оно начиналось с ^. Так:

text=1234
expr "x$text" : "x.\(.*\)"

Мы добавляем префиксx(к произвольному )как к тексту, так и к регулярному выражению, иначе команда завершится ошибкой, если содержимое $textокажется оператором expr.

Первый .соответствует первому символу $text, который не выводится, так как он не входит в группу захвата. Затем мы фиксируем остальные .*, состоящие из 0 или более символов, столько, сколько возможно для вывода.

Статус выхода будет не -нулевым, если регулярное выражение не соответствует($textпусто или начинается с чего-то, что не может быть интерпретировано как символ )или если вывод представляет собой число0(и в зависимости от реализации expr, некоторые из его различных вариантов написания, такие как 00, -0...)или пустая строка.

Но в любом случае вам не нужно запускать exprили использовать для этого регулярные выражения. Это могут сделать стандартные операторы раскрытия параметров оболочки :

.
text=1234
printf '%s\n' "${text#?}"

Где ${var#pattern}расширяется до содержимого $var, где начальная часть, соответствующая pattern, была удалена.

2
28.01.2020, 05:18

Предполагая, что текст находится в файле file, следующая команда sedудалит первую цифру в каждой строке файла и выведет результат:

sed 's/[[:digit:]]//' file

Тестирование:

$ cat file
123
1234
alpha123
a1b2c3
$ sed 's/[[:digit:]]//' file
23
234
alpha23
ab2c3

Если строка находится в переменной, вам не нужно регулярное выражение. Достаточно было бы

${string/[[:digit:]]/}

в bash.

$ string=alpha123
$ printf '%s\n' "${string/[[:digit:]]/}"
alpha23

Если вы хотите удалить цифру только в том случае, если она стоит в первой позиции, вы можете использовать стандартную подстановку параметров

${string#[[:digit:]]}

как в

$ string=1234
$ printf '%s\n' "${string#[[:digit:]]}"
234
2
28.01.2020, 05:18

Теги

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