Используя? с помощью sed

Не используйте базовый класс, если Вы не знаете то, что это означает, и что это применяется в этом случае. Если это применяется, используйте его, иначе, интерфейсы использования. Но отметьте ответ о маленьких интерфейсах.

Общедоступное Наследование злоупотребляется в OOD и выражает намного больше, чем большинство разработчиков понимает или готово соответствовать. Посмотрите Принцип Liskov Substitutablity

Короче говоря, если "" B тогда A, требует не больше, чем B и поставляет не меньше, чем B, для каждого метода, который он представляет.

22
задан User1 3 December 2010 в 17:30
поделиться

3 ответа

Если вы ищете ответ на конкретный пример, приведенный в вопросе, или почему он неправильно использует ? (независимо от синтаксиса), см. ответ Лоуренса Гонсалвеса .

]

Если вместо этого вы ищете ответ на общий вопрос о том, почему ? не имеет своего особого значения в sed, как вы могли ожидать:

По умолчанию sed использует «POSIX basic». синтаксис регулярных выражений ", поэтому знак вопроса должен быть экранирован как \? для применения его специального значения, в противном случае он соответствует буквальному знаку вопроса. В качестве альтернативы вы можете использовать опцию -r или --regexp-extended, чтобы использовать «расширенный синтаксис регулярного выражения», который меняет значение экранированных и неэкранированных специальных символов, включая ?.

В словах документации GNU sed (просмотр выполняется с помощью 'info sed' в Linux):

Единственное различие между базовыми и расширенными регулярными выражениями заключается в поведении нескольких символов: '?', '+', скобки и фигурные скобки ('{}'). В то время как базовые регулярные выражения требуют их экранирования, если вы хотите, чтобы они вели себя как специальные символы, при использовании расширенных регулярных выражений вы должны избегать их, если вы хотите, чтобы они соответствовали буквальному символу .

и поясняется опция:

-r --regexp-extended

Используйте расширенные регулярные выражения, а не основные регулярные выражения. Расширенные регулярные выражения - это те, которые принимает egrep; они могут быть более понятными, потому что они обычно имеют меньшую обратную косую черту, но являются расширением GNU и, следовательно, скрипты, которые их используют, не являются переносимыми.

Обновление

Более новые версии GNU sed теперь говорят следующее:

-E -r --regexp-extended

Используйте расширенные регулярные выражения вместо базовых регулярных выражений. Расширенные регулярные выражения - это те, которые принимает egrep; они могут быть более ясными, потому что они обычно имеют меньше обратного слеша. Исторически это было расширение GNU, но с тех пор расширение '-E' было добавлено в стандарт POSIX ( http://austingroupbugs.net/view.php?id=528 ), поэтому используйте '- E 'для мобильности. GNU sed принимает '-E' как недокументированную опцию в течение многих лет, а * BSD seds принимает '-E' также в течение многих лет, но сценарии, использующие '-E', могут не переноситься на другие старые системы.

Итак, если вам нужно сохранить совместимость с древним GNU sed, придерживайтесь -r. Но если вы предпочитаете лучшую кроссплатформенную переносимость в более современных системах (например, поддержка Linux + Mac), перейдите к -E (но учтите, что между GNU sed и BSD sed все еще есть некоторые причуды и различия, поэтому вам придется убедитесь, что ваши сценарии переносимы в любом случае).

7
ответ дан 29 November 2019 в 04:36
поделиться

Функция, которая должна возвращать число, следующее за «_» в имени файла, независимо от расширения файла:

realname () {
  local n=${$1##*/}
  local rn="${n%.*}"
  sed 's/^.*\_//g' ${$rn:-$n}
}
0
ответ дан 29 November 2019 в 04:36
поделиться

Часть решения заключается в том, чтобы избежать знака вопроса или использовать опцию -r.

sed 's/.*_\([^.]*\)\(\.\?[^.]\+\)\?$/\1/'

или

sed -r 's/.*_([^.]*)(\.?[^.]+)?$/\1/'

будут работать для:

file_1.gz
file_12.txt
file_123

, что приведет к:

1
12
123
0
ответ дан 29 November 2019 в 04:36
поделиться
Другие вопросы по тегам:

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