Как преобразовать определенный текст из списка в верхний регистр?

Вы можете попробовать использовать rsync для синхронизации с вашим устройством, хотя при передаче MTP вы обычно не можете устанавливать отметку времени и даты для каждого файла. Чтобы ускорить передачу, вы должны использовать опцию --size -only для rsync, а не опцию -t. Я считаю, что проще всего сменить каталог на каталог mtp, например, /run/user/1000/gvfs/mtp :host=blahblah/blah/blah, затем запустить:

rsync -n -vlr --size-only --delete /source/of/files/./

Опция -n предназначена для пробного прогона. Просто сотрите эту опцию, если вы удовлетворены результатами.

4
29.12.2020, 18:55
3 ответа

Вы переусердствуете, воспользуйтесь преимуществами своей файловой структуры, чтобы упростить ее!

Если мы находим строку [Unitedв строке, перевод в верхний регистр всего от закрывающей скобки до конца строки дает нужный результат. Переводя это на язык сед,

sed '/\[United/s/].*/\U&/' file

Обратите внимание, что приведенное выше относится только к GNU Sed. Если это недоступно, но в системе POSIX, вы можете использовать Ex(или посмотреть Awk-версию αғsнιη)с аналогичным синтаксисом:

printf '%s\n' 'g/\[United/s/].*/\U&/' '%p' | ex file

Чтобы сохранить изменения в файле вместо печати результатов, измените %pна x.

8
18.03.2021, 22:40

Использованиеawk:

awk -F"[][]" '$2 ~/^United/ { $2="["$2"]"; $3=toupper($3); }1' OFS='' infile

в [...]мы определили ]и [как разделитель полей, затем проверяем второе поле, если оно начинается с текста United, если да, то добавляем обратно []вокруг второго поля (I предположим, что нет другого столбца, склоняющего эти символы, иначе эти поля пропустят это ); затем мы преобразуем третий столбец в его значение в верхнем регистре; идиома 1триггер awkпечать по умолчанию (вид всегда истинного условия ).

5
18.03.2021, 22:40

С помощью awkмы можем сделать это, сначала определив позицию закрывающей квадратной скобки в текущей записи, когда эта запись объединена во 2-м поле.

$ awk '
    $2 == "[United" {
      p = match($0, /]/)
      $0 = substr($0, 1, p-1) \
        toupper(substr($0, p))
    }1
' f1.txt

Poixly sed может сделать это по тому же принципу, что и решение awk. Нам нужно получить позицию] и пометить ее так, чтобы пространство шаблона было разделено на две половины. У правой половины есть имя, и на нем мы прописываем его с помощью команды y///.

$ sed -e "
    /\[United[[:blank:]]/!b
   y/]/\n/
    h;s/.*\n//
    y/$(printf %s {a..z})/$(printf %s {A..Z})/
    x;s/\n.*//
    G
    y/\n/]/
" f1.txt
$ perl -pe 's/\[United\s+.*?]\K(.*)/\U$1/' f1.txt
1
18.03.2021, 22:40

Теги

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