sed: удалить все символы, кроме последних n символов - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь удалить все символы в текстовой строке, кроме оставшихся 11 символов.Это строка Sample Text_that-would$normally~be,here--pe_-l4_mBY, и в итоге я хочу получить -pe_-l4_mBY.

Вот что я пробовал:

$ cat food
Sample Text_that-would$normally~be,here--pe_-l4_mBY
$ cat food | sed 's/^.*(.{3})$/\1/'
sed: 1: "s/^.*(.{3})$/\1/": \1 not defined in the RE

Обратите внимание, что текстовая строка не является 'На самом деле он хранится в файле, я просто использовал cat food в качестве примера.

ОС - это macOS High Sierra 10.13.6, а bash версия - 3.2.57 (1) -релиз

Ответы [ 5 ]

0 голосов
/ 11 февраля 2019

Вы можете использовать хвост или расширение параметра:

string='Sample Text_that-would$normally~be,here--pe_-l4_mBY'
echo "$string" | tail -c 11
echo "${string#${string%??????????}}"

pe_-l4_mBY
pe_-l4_mBY
0 голосов
/ 11 февраля 2019

Попробуйте также:

grep -o -E '.{11}$' food

grep, как и sed, принимает произвольное количество аргументов имени файла, поэтому нет необходимости в отдельном cat.(См. Также бесполезное использование cat.)

0 голосов
/ 11 февраля 2019

также с rev/cut/rev

$ echo abcdefghijklmnopqrstuvwxyz | rev | cut -c1-11 | rev 

pqrstuvwxyz
0 голосов
/ 11 февраля 2019

Базовые регулярные выражения (используемые по умолчанию sed) требуют экранирования скобок в группе захвата и скобок в выражении фигурных скобок.( и { в противном случае считаются литеральными символами для сопоставления.

$ cat food | sed 's/^.*\(.\{3\}\)$/\1/'
mBY

Напротив, явный запрос sed на использование расширенных регулярных выражений с параметром -E меняет значение, с\( и \{ являются буквальными символами.

$ cat food | sed -E 's/^.*(.{3})$/\1/'
mBY
0 голосов
/ 11 февраля 2019

Вы можете использовать это sed с группой захвата:

sed -E 's/.*(.{11})$/\1/' file

-pe_-l4_mBY
...