У меня есть строка, которой я хотел бы манипулировать. Строка, H08W2345678
как бы я мог манипулировать ею, чтобы вывод был просто W2345678
?
Точно так же, если бы я хотел отбросить последние 4 символа, H08W2345678
чтобы я получил, H08W234
как бы я это сделал?
bash
shell
text-processing
sed
3kstc
источник
источник
sed
?H08W2345678
и должна манипулировать им, чтобыW2345678
Это значение с другими данными было помещено в отправленное электронное письмо. Отправка электронной почты будет осуществляться с помощью cron.awk
это. Я создаю массив, а затем изменяю каждый элемент в массиве (все по-разному - т.е. меняем метку времени эпохи в секундах на дату и т. Д.)printf %s\\n "XX,H08W2345678,YY" | awk -F, '{print substr($2, 4); print substr($2, 1, length($2)-4)}'
Ответы:
Просто используя bash (или
ksh93
откуда этот синтаксис илиzsh
):См. Wooledge wiki для более подробной информации о манипуляции со строками .
источник
"${string:0:${#string}-4}"
Работает в bash версии 4.1, если длина$string
не менее 4.abc-e
, где, когда вы отбрасываете первые три символа, у вас остается-e
(потомуecho -e
что не делает то, что вы хотели).sed 's/^.\{3\}//'
найдет первые три символа^.\{3\}
и заменит их пробелом. Здесь^.
будет соответствовать любой символ в начале строки (^
указывает на начало строки) и\{3\}
будет соответствовать предыдущему шаблону ровно 3 раза. Итак,^.\{3\}
подойдут первые три символа.Точно так
sed 's/.\{4\}$//'
же заменит последние четыре символа на пустые ($
указывает на конец строки).источник
's/^.\{3\}//'
и's/.\{4\}$//'
как я все еще учусь sed, большое спасибо...
вместо.\{3\}
так (для меня) это легче читать:sed -e 's/^...//' -e 's/....$//'
или в одном выражении с чередованием:sed -r 's/^...|....$//g'
. Если бы это было больше, чем несколько символов, то я бы использовал/.\{17}\/
выражение вместо/.............../
.-e
или-n
. Конечно, смысл «падение последних 4 -х символов» не определено для строки короче 4 -х символов, но, если кто - то хотел , чтобы приспособить это бросить первый или последний один символ, это может взорвать.Если у вас есть файл, в котором каждая строка представляет собой одиннадцатизначную (или любую другую) строку, которую вы хотите разделить,
sed
это инструмент для использования. Это хорошо для манипулирования одной строкой, но это излишне. Для одной строки ответ Джейсона, вероятно, будет лучшим, если у вас есть доступ к bash версии 4.2 или выше. Тем не менее, и Синтаксисы кажутся уникальными для Баш (ну, баш, ksh93, МКШ, и ЗШ) - я не вижу их в The Open Group Base спецификации для Shell Command Language . Если вы застряли в POSIX-совместимой оболочке, которая не поддерживает расширение подстроки (извлечение), вы можете использовать${parameter:offset}
${parameter:offset:length}
используется
printf
вместоecho
для защиты от таких строк, какabc-e
, например , где, когда вы отбрасываете первые три символа, вы остаетесь с-e
(иecho -e
не делаете то, что хотели бы).И, если вы вообще не используете оболочку семейства Bourne (или используете древнюю систему, предшествующую POSIX), они все равно должны работать:
Дополнительное ведущее пространство , чтобы избежать проблем со значениями ,
$string
которые являются фактическимиexpr
операторами (например,+
,/
,index
илиmatch
) или опциями (например,--
,--help
или--version
).источник
X
; например,expr "X$string" : 'X...\(.*\)'
. ИМО, это легче читать и понимать. Есть ли какая-то проблема с этим, или есть какая-то причина отдать предпочтение месту? (3) Сегодня я узнал, чтоexpr + "$string" : '...\(.*\)'
теперь работает. Я не помню этого 40 лет назад; достаточно ли широко он используется, чтобы его можно было рекомендовать? (4) Вы пропустили записку об ответе Джейсонвриана и придирку к ответу Химейла.expr +
только GNU (не будет работать ни на Solaris, ни на FreeBSD AFAICS). Я использую пробел вместо x, так как менее вероятно, что некоторыеexpr
реализации будут иметь операторы, начинающиеся с пробела, чем с,x
а также потому, что менее вероятно, что элементы сортировки начинаются с пробела, чем сx
. Но потом я понимаю, что это, вероятно, не лучший выбор дляexpr " $a" "<" " $b"
сравнения строк, поскольку некоторые реализации в конечном итоге проводят численное сравнение, когда$a
/$b
выглядят как числа. Может бытьexpr "@@$a"...
илиexpr "x $a"
может быть безопаснее.С:
Совпадение 3 или 4 символов кажется простым (для большинства оболочек):
Для более старых оболочек (например, оболочки Борна) используйте:
Если необходимо количество символов, используйте:
Конечно, эти регулярные выражения работают также с sed, awk и bash 3.0+:
источник
источник
cut
намного элегантнее, чем все остальное на этой странице.