Я пишу сценарий оболочки для встроенного Linux в небольшой промышленной коробке. У меня есть переменная, содержащая текст, pid: 1234
и я хочу удалить первые X символов из строки, чтобы осталось только 1234. У меня есть больше переменных, которые мне нужно «очистить», поэтому мне нужно вырезать X первых символов, и ${string:5}
они по какой-то причине не работают в моей системе.
Единственное, что есть в коробке, это sed
.
Я пытаюсь заставить работать следующее:
result=$(echo "$pid" | sed 's/^.\{4\}//g')
Любые идеи?
${string:5}
не работает, значит, вы не используете Bash или другую оболочку, поддерживающую этот синтаксис. Какую оболочку и версию вы используете? Как выглядит твой шебанг? Я предполагаю, что вы используетеsh
(например,dash
) или возможноzsh
.Ответы:
Это тоже сработает:
источник
awk -F": " '{print $2}'
. Тем не менее, это не мое любимое решение.Следующее должно работать:
Вы уверены
bash
, что оболочка выполняет ваш сценарий?Даже POSIX-совместимый
было бы предпочтительнее использовать внешний процесс, хотя это требует, чтобы вы жестко запрограммировали 5 в форме шаблона фиксированной длины.
источник
${var:5:2}
начнется1
и вернется12
.Вот краткий способ вырезать первые X символов с помощью
cut(1)
. В этом примере удаляются первые 4 символа путем вырезания подстроки, начинающейся с 5-го символа.источник
git log --pretty=oneline | cut -c 42- | head
cut -c ${LEN}-
. Фигурные скобки используются для объединения строки с допустимыми символами переменных, чтобы различать, что является переменной, а что нет. Если вам нужна дополнительная информация об этом, поищите в разделе «Конкатенация строк переменных в bash» дополнительные ресурсы о том, почему и как это работает.Используйте
-r
параметр ("использовать расширенные регулярные выражения в сценарии")sed
, чтобы использовать{n}
синтаксис:источник
sed -r 's/.{5}$//'
удалить последние 5 символов-r
(-E
в OS X, IIRC), если вы избежите фигурных скобок (хотя не знаю, работает ли это в OS X).-r
/-E
) работает в OS X.Вырежьте из строки первые два символа:
источник
пропустите его,
awk '{print substr($0,42)}'
где 42 - это на единицу больше, чем количество отбрасываемых символов. Например:источник
Скорее всего, у вас тоже будет
cut
. Если так:источник
cut
том, что он не обрабатывает последовательности пробелов разумно, использованиеtr -s ' '
для «сжатия» пробелов заставляет его вести себя лучше.Ну, там были решения здесь с
sed
,awk
,cut
и с помощьюbash
синтаксиса. Я просто хочу добавить еще один вариант, соответствующий POSIX:-c
сообщает tail, с какого байтового смещения начинать, считая от конца входных данных, но если число начинается со+
знака, оно идет от начала входных данных до конца.источник
Другой способ - использовать
cut
вместоsed
.источник
Я нашел ответ в чистом sed, предоставленном этим вопросом (правда, опубликованным после публикации этого вопроса). Это именно то, что вы просили, только в sed:
Точка в
sed '/./
) - это то, что вы хотите сопоставить. Ваш вопрос - это именно то, что я пытался, за исключением того, что в моем случае я хотел сопоставить определенную строку в файле, а затем раскомментировать ее. В моем случае это было:-i
послеsed
того, как это отредактировать файл на месте (удалить этот переключатель , если вы хотите , чтобы проверить ваше выражение соответствия до редактирования файла).(Я опубликовал это, потому что хотел сделать это полностью с помощью sed, поскольку этот вопрос задан, и ни один из предыдущих ответов не решил эту проблему.)
источник
Вместо того, чтобы удалять n символов с самого начала, возможно, вы могли бы просто извлечь цифры напрямую. Вот так...
Это может быть более надежное решение и кажется более интуитивным.
источник