Ответ 1
Это тоже сделает работу:
echo "$pid"|awk '{print $2}'
Я пишу shell script для встроенного Linux в небольшой промышленной коробке. У меня есть переменная, содержащая текст pid: 1234
, и я хочу удалить первые строки из строки X, поэтому осталось всего 1234. У меня больше переменных, которые мне нужно "очистить", поэтому мне нужно отключить X первых символов, а ${string:5}
по какой-то причине не работает в моей системе.
Единственное, что кажется в окне, это sed
.
Я пытаюсь сделать следующее:
result=`echo "$pid" | sed 's/^.\{4\}//g'`
Любые идеи?
Это тоже сделает работу:
echo "$pid"|awk '{print $2}'
Следующее должно работать:
var="pid: 1234"
var=${var:5}
Вы уверены, что bash
- это оболочка, выполняющая ваш скрипт?
Даже POSIX-совместимый
var=${var#?????}
было бы предпочтительнее использования внешнего процесса, хотя для этого необходимо жестко закодировать 5 в форме шаблона фиксированной длины.
Здесь приведен краткий способ разрезать первые X-символы с помощью cut(1)
. В этом примере удаляются первые 4 символа.
echo "$pid" | cut -c 4-
Используйте параметр -r
( "использовать расширенные регулярные выражения в script" ) до sed
, чтобы использовать синтаксис {n}
:
$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234
Вырезать первые два символа из строки:
string="1234567890"; echo "${string:2}"
Скорее всего, у вас будет cut
. Если да:
[[email protected]]$ echo "pid: 1234" | cut -d" " -f2
1234
проведите его через awk '{print substr($0,42)}'
, где 42 - это больше, чем количество символов, которые нужно удалить. Например:
$ echo abcde| awk '{print substr($0,2)}'
bcde
$
Другой способ, используя cut
вместо sed
.
result=`echo $pid | cut -c 5-`
Вместо того чтобы удалять n символов с самого начала, возможно, вы могли бы просто извлечь цифры напрямую. Вот так...
$ echo "pid: 1234" | grep -Po "\d+"
Это может быть более надежным решением и кажется более интуитивным.
Я нашел ответ в чистом седе, поставленном этим вопросом (по общему признанию, отправленный после того, как этот вопрос был отправлен). Это именно то, что вы просили, только в 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, поскольку этот вопрос задавался, и ни один из предыдущих ответов не решил эту проблему.)
Ну, здесь были решения с использованием sed
, awk
, cut
и использованием синтаксиса bash
. Я просто хочу добавить другой соответствующий POSIX вариант:
$ echo "pid: 1234" | tail -c +6
1234
-c
указывает хвосту, с какого байтового смещения начинаться, начиная с конца входных данных, но если число начинается со знака +
, оно начинается с начала входных данных и заканчивается до конца.