Как я могу удалить первые X символов из строки с помощью sed?

Я пишу shell script для встроенного Linux в небольшой промышленной коробке. У меня есть переменная, содержащая текст pid: 1234, и я хочу удалить первые строки из строки X, поэтому осталось всего 1234. У меня больше переменных, которые мне нужно "очистить", поэтому мне нужно отключить X первых символов, а ${string:5} по какой-то причине не работает в моей системе.

Единственное, что кажется в окне, это sed.

Я пытаюсь сделать следующее:

result=`echo "$pid" | sed 's/^.\{4\}//g'`

Любые идеи?

Ответ 1

Это тоже сделает работу:

echo "$pid"|awk '{print $2}'

Ответ 2

Следующее должно работать:

var="pid: 1234"
var=${var:5}

Вы уверены, что bash - это оболочка, выполняющая ваш скрипт?

Даже POSIX-совместимый

var=${var#?????}

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

Ответ 3

Здесь приведен краткий способ разрезать первые X-символы с помощью cut(1). В этом примере удаляются первые 4 символа.

echo "$pid" | cut -c 4-

Ответ 4

Используйте параметр -r ( "использовать расширенные регулярные выражения в script" ) до sed, чтобы использовать синтаксис {n}:

$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234

Ответ 5

Вырезать первые два символа из строки:

string="1234567890"; echo "${string:2}"

Ответ 6

Скорее всего, у вас будет cut. Если да:

[[email protected]]$ echo "pid: 1234" | cut -d" " -f2
1234

Ответ 7

проведите его через awk '{print substr($0,42)}', где 42 - это больше, чем количество символов, которые нужно удалить. Например:

$ echo abcde| awk '{print substr($0,2)}'
bcde
$

Ответ 8

Другой способ, используя cut вместо sed.

result=`echo $pid | cut -c 5-`

Ответ 9

Вместо того чтобы удалять n символов с самого начала, возможно, вы могли бы просто извлечь цифры напрямую. Вот так...

$ echo "pid: 1234" | grep -Po "\d+"

Это может быть более надежным решением и кажется более интуитивным.

Ответ 10

Я нашел ответ в чистом седе, поставленном этим вопросом (по общему признанию, отправленный после того, как этот вопрос был отправлен). Это именно то, что вы просили, только в sed:

result=\'echo "$pid" | sed '/./ { s/pid:\ //g; }'\''

Точка в sed '/./) - это то, что вы хотите сопоставить. Ваш вопрос - именно то, что я пытался сделать, за исключением того, что в моем случае я хотел сопоставить определенную строку в файле, а затем раскомментировать ее. В моем случае это было:

# Uncomment a line:
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file

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

(FTR, я разместил этот ответ не за кредит, а просто потому, что я хотел сделать это полностью с помощью sed, поскольку этот вопрос задавался, и ни один из предыдущих ответов не решил эту проблему.)

Ответ 11

Ну, здесь были решения с использованием sed, awk, cut и использованием синтаксиса bash. Я просто хочу добавить другой соответствующий POSIX вариант:

$ echo "pid: 1234" | tail -c +6
1234

-c указывает хвосту, с какого байтового смещения начинаться, начиная с конца входных данных, но если число начинается со знака +, оно начинается с начала входных данных и заканчивается до конца.