У меня есть файл, содержащий мои личные данные (.txt). Как я могу через терминал скопировать только несколько деталей из файла и поместить их в новый .txt
файл?
Например, если это содержимое файла:
name : farah age : 23 phone number : 0123 education : degree
как я могу скопировать только возраст и номер телефона и вывести их в новый .txt
файл?
command-line
text-processing
MsWanie
источник
источник
Ответы:
Есть несколько способов сделать это. Если ваш файл имеет некоторую известную структуру, вы можете использовать
grep
. Командаgrep
ищет в файле определенную фразу и возвращает строки, соответствующие этой фразе. Так что если ваш файл выглядитВы можете бежать,
grep Name info.txt
и он вернетсяName: Sally
. Затем вы можете перенаправить вывод в другой файл. Так зоветgrep Name info.txt > info2.txt
выведет строку в новый файл info2.txt. Если вы хотите добавить новые строки, вы можете сделать
grep Address info.txt >> info2.txt
в противном случае файл будет перезаписан.
Вы также можете научиться использовать текстовый редактор командной строки, как vim.
источник
Вы можете использовать grep для поиска регулярного выражения в файле details.txt и перенаправить результат в новый файл.
Если у всех строк, которые вы хотите скопировать, есть что-то общее, другие строки использовать нельзя:
Если вы не придется искать для каждой линии , которую вы хотите скопировать, все еще используя Grep, и добавить их к new.txt , используя
>>
в смену>
.источник
Есть также редакторы, которые работают в терминале, например, nano, vi и emacs.
Если вы используете графический интерфейс пользователя на своем локальном компьютере и терминал на удаленном компьютере, вы также можете использовать мышь для копирования и вставки из одного окна / вкладки терминала во второе.
источник
Предполагая, что входной файл
details.txt
содержит:Вы можете выбрать строки «имя» и «телефон» с помощью расширенного grep и перенаправить вывод в new.txt:
Это создаст new.txt с:
Как это устроено:
Grep печатает только совпадающие линии. В
-E
опции включен расширенный регулярное выражение, что дает вам возможность использовать|
(альтернатива). Не забудьте процитировать весь шаблон, поэтому|
будет интерпретироваться grep. В противном случае оболочка попытается интерпретировать. Вы не хотите этого здесь.источник
Файл, который вы показали, содержит все детали в одной строке:
Я предположил, что вы можете жестко закодировать и
age :
т. Д. В команду, но текст, следующий за ней, будет отличаться, и что детали могут быть не в указанном порядке или быть смежными.Вы можете извлечь части строки с
grep
«S-o
флага. Это печатает только соответствующую часть, а не всю линию.Если вы хотите включить
age :
иphone number :
части, вы можете использовать-e
флаг, чтобы указать несколько совпадений, или чередование.Выражение
[^ ]*
означает любое количество символов, которые не являются пробелами, поэтому оно соответствует символам послеage :
следующего пробела.Замените
file
на имя файла, который содержит ваши данные. Вы можете написать новый файл, перенаправив вывод в новый файл с>
оператором, например так:Когда вы это сделаете, вы не увидите никакого вывода. Сначала вы должны проверить вывод, а затем добавить перенаправление.
Вот пример с чередованием. Мы используем
-E
флаг, чтобы указатьgrep
использовать расширенное регулярное выражение. Синтаксис(pattern1|pattern2)
- это соответствуетpattern1
и / илиpattern2
. Если один из них найден, он будет напечатан (независимо от того, найден другой или нет). Сейчас я использую+
значение по крайней мере одного из предшествующих символов вместо*
значения ноль или более от предыдущего символа. В этом контексте они оба работают одинаково хорошо.Если вы хотите , чтобы опустить
age :
иphone number:
детали, вы можете использовать-P
флаг , чтобы попроситьgrep
использовать Perl-совместимые регулярные выражения. Это поддерживает чередование, а также способ сопоставления текста по заданному шаблону:Если вы хотите отформатировать текст по-другому, вы можете использовать
sed
, например:Это зависит от
age
тогоphone number
, что наступит раньше , поэтому отрегулируйте соответственно, если это не так. Если вы не можете положиться на порядок, вы можете использовать эту очень запутанную команду:Это переставляет линию так, что
phone number :
сечение появляется первым в каждой строке, а затем выполняется вторая замена, чтобы выбрать нужные детали. Я обязан технике, использованной здесь, для этого ответа Муру .Примечания к
sed
командам, не охваченным предыдущими пояснениями-r
используйте расширенное регулярное выражение для более удобочитаемых команд (GNUsed
понимает-E
с тем же значением)s/old/new/
заменитьold
наnew
(pattern)
сохраняетpattern
для ссылки позже, с помощью\1
или и\2
т. д. (в соответствии с порядком слева направо, в котором встречаются группы захвата - обратите внимание, что ониsed
будут содержать только до 7 из них!)..
любой символ, следовательно,.*
представляет любое количество любых символов.;
отделяет команды, как в оболочке.источник