Несмотря на то, что на этот вопрос был дан ответ / принят несколько лет назад, принятый в настоящее время ответ является верным только для однобайтовых кодировок, таких как iso-8859-1, или для однобайтовых подмножеств наборов переменных байтов ( как латинские символы в UTF-8). Даже использование многобайтовых сплайсов вместо этого будет работать только для фиксированных многобайтовых кодировок, таких как UTF-16. Учитывая, что сейчас UTF-8 находится на пути к тому, чтобы стать универсальным стандартом, и если посмотреть на этот список языков по количеству носителей языка и , то этот список из 30 лучших языков по родному / вторичному При использовании важно указать простую методику, дружественную к символам (не основанную на байтах), с использованием cut -c
и tr
/ sed
с классами символов.
Сравните следующее, что вдвойне не удается из-за двух распространенных латинско-центричных ошибок / предположений относительно проблемы байтов и символов (одна - head
против cut
, другая - [a-z][A-Z]
против [:upper:][:lower:]
) :
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ head -c 1 | \
$ sed -e 's/[A-Z]/[a-z]/g'
[[unreadable binary mess, or nothing if the terminal filtered it]]
к этому (примечание: это работало нормально на FreeBSD, но оба cut
& tr
на GNU / Linux все еще искалечили греческий язык в UTF-8 для меня, хотя):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ cut -c 1 | \
$ tr '[:upper:]' '[:lower:]'
π
В другом, более недавнем ответе уже предлагалось «вырезать», но только из-за побочной проблемы, которую он может использовать для указания произвольных смещений, а не из-за непосредственно релевантной проблемы символа и байтов.
Если ваш cut
не обрабатывает -c
с кодированием переменной байта правильно, для "первых X
символов" (замените X
на ваш номер), вы можете попробовать:
sed -E -e '1 s/^(.{X}).*$/\1/' -e q
- ограничено первой строкой, хотя
head -n 1 | grep -E -o '^.{X}'
- который ограничен первой строкой и объединяет две команды, хотя
dd
- который уже был предложен в других ответах, но действительно громоздок
- Сложный
sed
скрипт с буфером скользящего окна для обработки символов, распределенных по нескольким строкам, но это, вероятно, более громоздко / хрупко, чем просто использование чего-то вроде dd
Если ваш tr
не обрабатывает классы символов с переменным байтовым кодированием правильно, вы можете попробовать:
sed -E -e 's/[[:upper:]]/\L&/g
(для GNU)