sed на OS X - может казаться, не использует + в regexps

Я сказал бы, что это - индикатор дефектной структуры таблицы. Возможно, различные типы местоположения должны быть разделены в различных таблицах, позволив Вам сделать намного более богатые запросы и также постараться не иметь лишние столбцы вокруг.

, Если Вы неспособны изменить структуру, что-то как ниже могло бы работать:

SELECT
    *
FROM
    Test
WHERE
    Account_Location = (
        CASE LocationType
          WHEN 'location' THEN @locationID
          ELSE Account_Location
        END
    )
    AND
    Account_Location_Area = (
        CASE LocationType
          WHEN 'area' THEN @locationID
          ELSE Account_Location_Area
        END
    )

И т.д... Мы не можем изменить структуру запроса на лету, но мы можем переопределить его, заставив предикаты равняться себе.

РЕДАКТИРОВАНИЕ: вышеупомянутые предложения, конечно, намного лучше, просто игнорируют мой.

25
задан stib 10 December 2014 в 23:38
поделиться

5 ответов

В OSX sed по умолчанию использует базовые RE. Вы должны использовать sed -E , если хотите использовать современные RE, включая один или несколько операторов "+" .

См. здесь для указание на то, что sed по умолчанию использует базовые RE, здесь для современного синтаксиса RE и здесь для базового RE ( ed ) информации.


В качестве альтернативы, если у вас есть механизм регулярных выражений, который не вообще поддерживает + , вы можете просто использовать вместо него * , преобразовав (например):

[a-z]+

в:

[a-z][a-z]*
53
ответ дан 28 November 2019 в 18:17
поделиться

Устаревшие базовые регулярные выражения не поддерживают кванторы + и ? . Это обычные символы.

Альтернативы для [0-9] + , например, [0-9] {1,} или [0-9] [0 -9] * .

Или вы можете использовать sed -E , чтобы использовать современные расширенные регулярные выражения.

8
ответ дан 28 November 2019 в 18:17
поделиться

Если + не работает, вы всегда можете использовать {1,}

2
ответ дан 28 November 2019 в 18:17
поделиться

вы можете использовать awk

# echo 1234abcd| awk '{gsub(/[0-9]+/,"#")}1'
#abcd

# echo abcd| awk '{gsub(/[0-9]+/,"#")}1'
abcd
1
ответ дан 28 November 2019 в 18:17
поделиться

Многие из утилит UNIX OS X имеют версии, в которых отсутствуют удобства их эквивалентов GNU. Как говорит Pax, вы можете использовать -E:

drigz@mbp drigz 0$ echo 1234abcd | /usr/bin/sed "s/[0-9]\+/#/g" 
1234abcd
drigz@mbp drigz 0$ echo 1234abcd | /usr/bin/sed -E "s/[0-9]+/#/g" 
#abcd

Обратите внимание, что требуются небольшие изменения синтаксиса вашего регулярного выражения (в данном случае с \ + на +).

Однако я предпочитаю использовать fink для получения утилит GNU:

drigz@mbp drigz 0$ echo 1234abcd | /sw/bin/sed "s/[0-9]\+/#/g"
#abcd
drigz@mbp drigz 0$ /sw/bin/sed --version
GNU sed version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
1
ответ дан 28 November 2019 в 18:17
поделиться
Другие вопросы по тегам:

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