/ / unix: jak sprawdzić, czy ciąg pasuje do wyrażenia regularnego - regex, linux, unix, dopasowywanie wzorca, fish

unix: jak sprawdzić, czy ciąg pasuje do wyrażenia regularnego - regex, linux, unix, dopasowywanie wzorców, ryba

Wypróbować skorupa ryby, więc tłumaczę swoje funkcje bash. Problem polega na tym, że w jednym przypadku używam wyrażeń regularnych bash, aby sprawdzić, czy łańcuch pasuje do wyrażenia regularnego. Nie mogę wymyślić, jak to przełożyć na ryby.

Tutaj to mój przykład.

if [[ "$arg" =~ ^[0-9]+$ ]]
...
  • Zajrzałem do środka sed, ale nie widzę sposobu, aby ustawić status wyjścia na podstawie tego, czy wyrażenie regularne pasuje.
  • Spojrzałem na delegowanie do Rubin, ale ponownie uzyskanie statusu wyjścia na podstawie dopasowania wymaga uczynienia tego naprawdę brzydkim (patrz poniżej).
  • Spojrzałem na delegowanie z powrotem do grzmotnąć, ale pomimo wypróbowania może trzech lub czterech sposobów, nigdy nie dało się tego dopasować.

Czy w * nix istnieje sposób, aby sprawdzić, czy ciąg znaków pasuje do wyrażenia regularnego, więc mogę upuścić go w warunek?


Oto, co obecnie mam, ale z czego jestem niezadowolony:

# kill jobs by job number, or range of job numbers
# example: k 1 2 5
# example: k 1..5
# example: k 1..5 7 10..15
# example: k 1-5 7 10-15
function k
for arg in $argv
if ruby -e "exit ("$arg" =~ /^[0-9]+$/ ? 0 : 1)"
kill -9 %$arg
else
set _start (echo "$arg" | sed "s/[^0-9].*$//")
set _end   (echo "$arg" | sed "s/^[0-9]*[^0-9]*//")

for n in (seq $_start $_end)
kill -9 %"$n"
end
end
end
end

Odpowiedzi:

9 dla odpowiedzi № 1

Standardowym sposobem jest użycie grep:

if echo "$arg" | grep -q -E "^[0-9]+$"
kill -9 %$arg

1 dla odpowiedzi nr 2

Sugerowałbym użyć wbudowanego dopasowanie łańcucha podkomenda

if string match -r -q  "^[0-9]+$" $arg
echo "number!"
else
echo "not a number"
end

0 dla odpowiedzi № 3

Począwszy od wersji 3.2, Bash natywnie obsługuje wyrażenia regularne, patrz http://www.tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF