Читайте от определенного момента до определенного символа

Скажем, у меня есть файл вроде этого:

foo bar foo bar foo bar foo bar something useful"foo bar foo bar" 

В принципе, я хочу знать, как я могу получить строку something useful само по себе, либо сохраненное в свой собственный файл, либо отображаемое только как результат.

  • Что-то не так с моим скриптом или Bash намного медленнее, чем Python?
  • Использование grep с шаблоном, который содержит переменную, подлежащую расширению
  • Почему printf «сжимает» умлаут?
  • используйте 'find' для поиска каталогов !, содержащих определенный filetype foo
  • Нажмите пробел, чтобы продолжить
  • Что делает следующий скрипт?
  • Всегда будет одинаковое количество символов (33) перед something useful и всегда будет " сразу после него».

  • Невозможно назначить вывод вложенных команд переменной в bash
  • Дубликаты в истории bash
  • Исправлено ли исправление shellshock bash базовыми инструментами командной строки, такими как echo и cat?
  • Просмотреть удаленное значение $ PATH внутри сценария оболочки
  • Как написать скрипт для выполнения файлов в нескольких каталогах
  • Как использовать команду «date» для отображения номера недели в году?
  • 5 Solutions collect form web for “Читайте от определенного момента до определенного символа”

    Попробуй это:

     cut -c 34- | cut -d '"' -f1 

    Первый cut удаляет первые 33 символа; во втором cut сохраняется только часть перед первым " .

    Вот версия GNU grep с использованием синтаксиса perl:

     grep -oP '.{32}\K[^"]*' 

    он загоняет первые 32 символа, отсекает его с \K и печатает остальное до первого " .

    Решение vim:

     vim test.txt -c '%s/\v.{32}(.{-})".*/\1' -c 'w output.txt' -c 'q!' 

    Сохраняет результат в output.txt , который, очевидно, может быть изменен.

    В выражении bash и расширении параметра

     $ nline="${line%%\"*}" #strip everything from first " seen to the end $ echo "${nline:32}" #print everything from offset 32 to the end 

    Вы можете использовать sed для выполнения своей задачи

     sed -e 's/^.\{32\}//;s/".*//' filename.txt 

    Это удаляет первые 32 символа и удаляет все после первого " .

    Эти замены будут выполняться в каждой строке файла. Чтобы применить это к определенной строке, используйте это:

     sed -e 'linenumber{s/^.\{32\}//;s/".*//;}' filename.txt 

    где linenumber – любое число.

     linenumber{ # on the linenumber-th line, do the following s/^.\{32\}// # remove the first 33 characters s/".*// # remove the first quote and everything following it } 
    Linux и Unix - лучшая ОС в мире.