Преобразовать в нижний регистр только определенные слова

El comportamiento real de esto es el siguiente:

si está en lessy 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:

enter image description here

2
09.06.2019, 22:49
4 ответа

Следующее решение использует 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, подстановка команд и другие вещи.

2
27.01.2020, 21:50

С оболочкой 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(, не делая предположений о том, какими символами они могут быть ). Вам нужно будет адаптировать его, если слова, возможно, разделены символами, отличными от пробела, или если перед первым словом могут быть символы-разделители слов.

4
27.01.2020, 21:50

С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 .

3
27.01.2020, 21:50
lc_var=$(echo $var | sed 's/^\([^ ]*\)\(.*\)/\1\L\2/g')

(с небольшой помощьюhttp://timmurphy.org/2013/02/24/converting-to-uppercase-lowercase-in-sed/)

1
27.01.2020, 21:50

Теги

Похожие вопросы