Прочитайте файл и скопируйте его в другой файл.

У меня возникла проблема, мне нужно скопировать содержимое файла и удалить пару строк, если они соответствуют выходу из предыдущей команды. Но до сих пор у меня возникла проблема в том, чтобы поддерживать файловые строки точно так же. Я помещаю простую часть скрипта, поскольку если опустить копию не являются частью проблемы, так как это происходит с незатронутыми строками.

Для примера:

В исходном файле у меня есть следующее

Testing, resuming text 

При запуске скрипта поля становятся:

 Testing, resuming text 

Я делаю следующее:

 #!/usr/bin/bash rm /tmp/dest_file while read line do echo $line >> /tmp/dest_file done < $1 

Проблема, с которой я сталкиваюсь, заключается в том, что файлы станут разными из-за полей, отформатированных на вкладке.

  • Как искать? в человеке?
  • Проблема с пробелами при использовании в команде find
  • как сохранить вывод команды в массив с каждым значением в двойной кавычки
  • Не удается получить доступ к внешнему жесткому диску.
  • Как выполнить xargs grep для вывода grep с пробелами?
  • Почему «ls» внезапно обматывает предметы пробелами в одинарных кавычках?
  • Помещение одной цитаты в имя файла
  • Как избежать этой строки скрипта bash?
  • 2 Solutions collect form web for “Прочитайте файл и скопируйте его в другой файл.”

    Введите свою переменную:

     echo "$line" >> /tmp/dest_file 

    Это уже несколько раз появилось на этом сайте – см. « Понимание IFS» и связанных вопросов. В этом ответе я собираюсь подвести итог тому, что может пойти не так и как избежать этого; см. связанные потоки для деталей.

    read line выполняет следующие действия:

    1. Чтение со стандартного ввода до первого байта, который является либо новой line либо нулем, и помещает данные в переменную, называемую line .
    2. Удалите любую обратную косую черту, которая не находится в конце строки. Двойная обратная косая черта \\ становится единственным обратным слэшем. Другими словами, обратная косая черта цитирует следующего символа, пока она не является символом новой строки.
    3. Если read остановлено на новой строке, а символ в конце строки – \ , разделите последовательность обратной косой черты и продолжите чтение, добавив к переменной. Повторяйте до первой строки: новой строки, которой не предшествует обратная косая черта; нулевой байт; конец ввода.
    4. Разделите самый длинный суффикс line , состоящий из символов в $IFS . По умолчанию IFS содержит вкладку, пробел и новую line , так что это исключает пробелы ASCII с конца line .
    5. Разделите самый длинный префикс line , состоящий из пробельных символов в $IFS .

    Например, если вход

      : hello\ world: : wibble 

    затем read line в line содержащей : helloworld: : (без начального пространства) со значением по умолчанию IFS . Если IFS был изменен на : (только двоеточие), то read line приводит к : helloworld: (с пробелом в начале и в конце). Если IFS содержит оба : и пробел, то результатом будет : helloworld (без начального или : helloworld пробела).

    Чтобы избежать влияния IFS , установите его в пустое значение (обратите внимание, что это отличается от его отмены). Вы можете установить его только для команды read , написав IFS= read (см. Почему «IFS = read» используется так часто, вместо `IFS =; while read..`? ).

    Чтобы избежать обработки обратной косой черты, пропустите параметр -r для read .

    Если оболочка не является zsh, если на входе присутствует нулевой байт, то последующие символы теряются. Оболочки не предназначены для чтения двоичных данных.

    Таким образом, идиома для чтения одной строки за раз:

     while IFS= read -r line; do … # process "$line" end 

    Когда вы используете переменную line , обязательно указывайте двойные кавычки вокруг переменных подстановок : "$line" . Без двойных кавычек оболочка сначала расширяет значение переменной, затем разбивает это значение на отдельные слова везде, где оно содержит символы из IFS , и каждое слово интерпретируется как шаблон подстановочного знака и заменяется списком соответствующих файлов (если есть нет соответствующих файлов, шаблон остается как есть). Итак, echo 'a* b*' | IFS= read -r line; echo $line echo 'a* b*' | IFS= read -r line; echo $line echo 'a* b*' | IFS= read -r line; echo $line расширяет список файлов в текущем каталоге, начинающемся с a или b ; чтобы получить вход без изменений, используйте echo 'a* b*' | IFS= read -r line; echo "$line" echo 'a* b*' | IFS= read -r line; echo "$line" echo 'a* b*' | IFS= read -r line; echo "$line" .

    Также обратите внимание, что команда echo иногда модифицирует строку, которую она печатает. Точный способ зависит от оболочки. Некоторые оболочки обрабатывают escape-обратные экраны, а некоторые оболочки распознают параметры. Использование echo для вывода строки verbatim только убедитесь, что вы знаете, что строка не содержит обратную косую черту и не начинается с тире ( - ). Надежный и переносимый способ печати строки как есть

     printf '%s\n' "$line" 

    Это выводит новую строку после строки, например, echo . Вы можете опустить новую строку, опуская \n в приведенной выше команде.

    Interesting Posts

    вызов сценария из perl / python / ruby ​​и получение вывода

    В ярлыке «Переключение окон приложения» есть связанный ярлык «Переход к предыдущему окну приложения»

    Почему «ps -p proc1 proc2 proc3» показывает «-csh», «-tcsh» и «- / bin / tcsh», тогда как «ps -p proc » индивидуально все говорят «tcsh»?

    При попытке изменить имя пользователя терминал сообщает, что пользователь в настоящее время используется процессом

    Как отобразить дерево устройств ядра

    Почему статус sendmail продолжает изменяться на «мертвые, но сусики заблокированы»?

    Нежелательная часть каталога с unzip?

    Как установить unetbootin на процессор E1 Vision AMD?

    Различие между Sha1sum, Sha256sum и Md5sum

    Использование resize2fs со смещением файловой системы

    Раздел Win7 NTFS пуст с использованием Linux LiveCD

    Cronjob запускает скрипт, который вызывает другой скрипт

    pdftoppm (v 3.0) очень медленно конвертирует миниатюру в более новую версию

    Один из моих pdf-файлов на моем сервере apache можно получить, а другой не может, с теми же правами и одним и тем же каталогом

    Как легко обновить список md5sums?

    Linux и Unix - лучшая ОС в мире.