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

126

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

Единственное, что есть в коробке, это sed.

Я пытаюсь заставить работать следующее:

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

Любые идеи?

Kokesh
источник
10
Если ${string:5}не работает, значит, вы не используете Bash или другую оболочку, поддерживающую этот синтаксис. Какую оболочку и версию вы используете? Как выглядит твой шебанг? Я предполагаю, что вы используете sh(например, dash) или возможно zsh.
Приостановлено до дальнейшего уведомления.

Ответы:

-1

Это тоже сработает:

echo "$pid"|awk '{print $2}'
Арно Ф.
источник
27
Этот вопрос - первый ответ на вопрос «пропустить первые N символов в строке». Вы не ответили на вопрос.
jww
Похоже, это не работает, и если да, то можете ли вы объяснить, как это сделать?
Александр Миллс
Это действительно работает в моей системе. Возможно, проблема с разделителем полей, попробуйте awk -F": " '{print $2}'. Тем не менее, это не мое любимое решение.
mzuther
197

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

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

Вы уверены bash, что оболочка выполняет ваш сценарий?

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

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

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

chepner
источник
1
Вы также можете указать длину с помощью второго параметра: ${var:5:2}начнется 1и вернется 12.
Max Candocia
109

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

echo "$pid" | cut -c 5-
Рэнди Дев
источник
2
Это самое простое решение!
Брэндон
2
Технически OP запросил sed, но я считаю, что это лучшее решение для вопроса «Как удалить первые символы X из строки [в терминале / bash]». При использовании в сочетании с git это хорошо:git log --pretty=oneline | cut -c 42- | head
Markiemers
1
+1 Простое и полезное решение .. Когда у меня был URL-адрес http: // <example.com> и я вырезал протокол http: //, я должен был сказать 8 символов вместо 7. Я не знаю , но у меня это сработало.
Сантош Кумар Арджунан
1
Сантош Кумар Арджунан: это потому, что пример "echo" $ pid "| cut -c 4-" на самом деле не отсекает первые 4 символа, а извлекает подстроку, начиная с 4-го символа. Поэтому он фактически обрезает первые 3 символа. Таким образом, если вы хотите вырезать 7 первых символов, вы хотите извлечь все из 8-го символа и, таким образом, действительно выполнить «cut -c 8-»
al-ash
1
@DeanHiller cut -c ${LEN}-. Фигурные скобки используются для объединения строки с допустимыми символами переменных, чтобы различать, что является переменной, а что нет. Если вам нужна дополнительная информация об этом, поищите в разделе «Конкатенация строк переменных в bash» дополнительные ресурсы о том, почему и как это работает.
JustCarty,
46

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

$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234
Марк Лонгэр
источник
1
как бы это было в случае, если бы я хотел удалить последние X символов из строки?
Kokesh
5
@Kokesh: вместо этого вы можете sed -r 's/.{5}$//'удалить последние 5 символов
Марк Лонгэр
7
Вы можете сделать это без -r( -Eв OS X, IIRC), если вы избежите фигурных скобок (хотя не знаю, работает ли это в OS X).
Приостановлено до дальнейшего уведомления.
2
@Dennis: Я только что проверил - уход от фигурных скобок (и отключение -r/ -E) работает в OS X.
Гордон Дэвиссон,
16

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

$ string="1234567890"; echo "${string:2}"
34567890
dtp70
источник
@ dtp70 Большое спасибо за общий ответ, он отлично сработал!
wolfram77
10

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

$ echo abcde| awk '{print substr($0,2)}'
bcde
$
Бен
источник
8

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

[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234
Шон Чин
источник
1
Проблема в cutтом, что он не обрабатывает последовательности пробелов разумно, использование tr -s ' 'для «сжатия» пробелов заставляет его вести себя лучше.
Thor
1
Это не предназначено для пения и танцев; он прост, делает то, что написано на банке, и широко доступен. Он должен отлично работать для указанных требований и, безусловно, более надежен, чем вырезание фиксированных символов из определенных позиций.
Shawn Chin
5

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

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

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

Mecki
источник
4

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

result=`echo $pid | cut -c 5-`
Евгений
источник
Он хочет удалить первые 4 символа. Это получает первые 4 символа.
ММ.
2

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

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

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

# Uncomment a line (edit the file in-place):
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file

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

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

treehead
источник
1

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

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

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

user1751825
источник