El comportamiento real de esto es el siguiente:
si está en less
y tiene un archivo con una línea muy larga, si se desplaza por la línea larga hacia abajo y hacia arriba, tendrá varias líneas al copiar todo el texto. Después de eso, cuando desplace las líneas divididas hacia abajo sobre la parte inferior de la terminal y vuelva a desplazar las líneas hacia arriba, los saltos de línea se eliminarán nuevamente.
Para visualización:
Следующее решение использует GNU sed и тестировалось только в bash. Это работает, даже если переменная содержит многострочный -текст.
lc_var="$(printf "%s\n" "$var"|sed ':l;$!{N;bl};s:\s.*:\L&.:')"
lc_var="${lc_var%.}"
Большое спасибо @Stéphane Chazelas за обсуждение пограничных случаев, таких как echo, sed -z, подстановка команд и другие вещи.
С оболочкой zsh
:
set -o extendedglob
lc_var=${var/%(#m) */${(L)MATCH}}
Где ${var/%pattern/replacement}
как в ksh заменяет конец переменной, которая соответствует pattern
на replacement
, (#m)
приводит к тому, что совпадающая часть сохраняется в $MATCH
(, это та часть, которая требуетсяextendedglob
)и ${(L)MATCH}
преобразует $MATCH
в нижний регистр.
С оболочкой bash
:
tmp1=${var%% *}
tmp2=${var#"$tmp1"}
lc_var=$tmp1${tmp2,,}
POSIX, вы бы сделали:
lc_var=$(
awk '
BEGIN{
var = ARGV[1]
if (i = index(var, " "))
var = substr(var, 1, i) tolower(substr(var, i + 1))
print var "."
}' "$var"
)
lc_var=${lc_var%.}
В любом случае, это не может выглядеть как lc_var=$(echo $var...)
, потому что $(...)
является синтаксисом оболочки POSIX/Korn/bash/zsh, и в этих оболочкахecho
не может выводить произвольные данные и расширения переменных следует заключать в кавычки (, за исключением, возможно,zsh
).
Все эти варианты превращают в нижний регистр все символы после первого пробела в $var
(, не делая предположений о том, какими символами они могут быть ). Вам нужно будет адаптировать его, если слова, возможно, разделены символами, отличными от пробела, или если перед первым словом могут быть символы-разделители слов.
Сbash
:
var='fOo bar1 baR2 bArab'
tail=${var#* }; lc_var="${var%% *} ${tail,,}"
echo "$lc_var"
fOo bar1 bar2 barab
как функция:
set_lc(){ declare -n v=$1; declare t=${2#* }; v="${2%% *} ${t,,}"; }
или:
set_lc(){ typeset -n _v=$1; typeset h=${2%% *}; typeset -l t=${2#"$h"}; _v=$h$t; }
(эта вторая версия также должна работать в ksh
и будет обрабатывать аргумент, состоящий из одного слова)
set_lc var 'FOO BAR BAZ'
echo "$var"
FOO bar baz
Больше информации о странном и ограниченном расширении параметров bash , модификаторах и о declare/typeset в руководстве bash .
lc_var=$(echo $var | sed 's/^\([^ ]*\)\(.*\)/\1\L\2/g')
(с небольшой помощьюhttp://timmurphy.org/2013/02/24/converting-to-uppercase-lowercase-in-sed/)