Esto es lo que sucedió :Estaba construyendo este programa a partir de las fuentes. Los mantenedores genios decidieron que:
$HOME/.bashrc
para que puedan hacer suposiciones en los scripts de compilación. Eso llenó mi .bashrc
de export CC
, export CXX
, export C_INCLUDE_PATH
, LD_PRELOAD
y más cosas. Y eso arruinó las cosas.
Lección aprendida :Siempre revise su ~/.profile
, ~/.shrc
, ~/.bashrc
, ~/.bash_profile
, ~/.login
, ~/.bash_login
para nuevas entradas extrañas.
Стандартной командой для применения регулярных выражений к строковым аргументам является 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
, была удалена.
Предполагая, что текст находится в файле 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