Я пытаюсь удалить первое вхождение цифры (й), точку, второе вхождение цифры (ей) и пробел перед словом ,
Я придумал это регулярное выражение:
sed 's/^[0-9]\+.[0-9]\+\s//' input.txt > output.txt
Образец текста:
2.14 Italien
2.15 Japonais
Мое регулярное выражение не работает, к сожалению. Существует проблема с \s
но я не могу точно определить, что это ...
Кто-нибудь может помочь?
редактировать Проблема в том, что мне нужно удалить только первый пробел, так как текст содержит пробелы, как вы можете видеть ниже:
3.15 Chichewa
3.16 Chimane
3.17 Cinghalais
3.18 Créole de Guinée-Bissau
[\s]\+
Кроме того, точка имеет особое значение, если ее не экранировать, возможно, вам стоит позаботиться об этом.sed
вызывать, когда OP использует метасимволы ERE (+
) и расширенное RE не включены по умолчанию?-r
переключатель; и чтобы сделать его более запутанным, вы не можете избежать плюс сsed -r
,\s
работает так же. Оба перестают работать с--posix
переключатель.-r
требуется для расширенных регулярных выражений для работы ...Ответы:
Используемая вами команда должна работать как есть с GNU
sed
, Но с BSDsed
, который, например, поставляется с OS X, не будет.Если вы пытаетесь использовать Расширенные регулярные выражения - которые поддерживают
+
метасимвол - вам нужно явно включить их. Для BSDsed
ты делаешь это сsed -E
и для GNUsed
сsed -r
,\+
в одиночестве делает с GNUsed
когда ERE не включены, но это менее переносимо.Вы используете Perl-как
\s
, который не существует для базовых и расширенных регулярных выражений. регулярноеsed
не поддерживает регулярные выражения Perl GNUsed
поддерживает\s
- но было бы удобнее просто добавить пробел к вашему регулярному выражению.Наконец, ваш
.
соответствует одному символу, поэтому ваше регулярное выражение будет соответствовать любому символу в этом месте, а не только точке. использование\.
чтобы правильно избежать этого.Таким образом, решение будет для GNU
sed
:Или для BSD
sed
:Таким образом, вам не нужно другое регулярное выражение для разных версий
sed
, С вашим примером:Если реальный проблема в том, что вы хотите получить второй столбец файла, разделенного пробелами, тогда вы делаете это неправильно. Либо использовать
awk
как говорит @Srdjan Grubor, или используйтеcut
:-f2-
задает второй и все последующие столбцы, поэтому в качестве первого разделителя он будет взят в качестве первого пробела, а остальные будут выведены.источник
sed -r 's/[0-9]+\.[0-9]+ //' input.txt > out.txt
но безрезультатно.sed
, Что конкретно не работает? Какой результат вы получаете? Самое простое решение в вашем примере будетcut -d' ' -f2-
хоть.U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
а затемU+00A0 NO-BREAK SPACE
, а не только один пробел.sed -r 's/^[0-9]+\.[0-9]+ //' input
должен делать, если вы копируете все пространство между вашими числами и строкой в фактическую команду.\s
является[[:space:]]
Почему бы не использовать awk?
источник
Если единственное, что нужно, это сбросить все, включая первый пробел, то этого достаточно.
источник
sed -r 's/[^ ]//'
для файла с только начальным пробелом производит желаемый эффект.Вы также можете использовать grep:
grep -oP '[a-zA-Z]+$' input.txt > output.txt
источник
С любым седом:
Или, возможно, этого может быть достаточно:
источник