Как выборочно скопировать детали из файла и вставить их в новый файл?
У меня есть файл, содержащий мои личные данные (.txt). Как я могу через терминал скопировать только несколько деталей из файла и поместить их в новый .txt файл?
Например, если это содержимое файла:
name : farah age : 23 phone number : 0123 education : degree
как я могу скопировать только возраст и номер телефона и вывести их на новый .txt файл?
5 ответов
Есть несколько способов сделать это. Если ваш файл имеет известную структуру, вы можете использовать grep, grep Команда ищет в файле определенную фразу и возвращает строки, соответствующие этой фразе. Так что если ваш файл выглядит
Имя: Салли
Дата рождения: 7.31.76
Адрес: 1234 Main St.
SSN: 123-45-6789
Вы можете запустить grep Name info.txt и он вернется Name: Sally, Затем вы можете перенаправить вывод в другой файл. Так зовет
grep Name info.txt > info2.txt
выведет строку в новый файл info2.txt. Если вы хотите добавить новые строки, вы можете сделать
grep Address info.txt >> info2.txt
в противном случае файл будет перезаписан.
Вы также можете научиться использовать текстовый редактор командной строки, как vim.
Файл, который вы показали, содержит все детали в одной строке:
name : farah age : 23 phone number : 0123 education : degree
Я предположил, что вы можете жестко кодировать age : и т.д. в команду, но текст, следующий за ним, будет отличаться, и что детали могут быть не в указанном порядке или быть смежными.
Вы можете извлечь части строки с grep"s -o флаг. Это печатает только соответствующую часть, а не всю строку.
Если вы хотите включить age : а также phone number : части, вы можете использовать -e флаг для указания нескольких совпадений или чередования.
$ grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file
age : 23
phone number : 0123
Выражение [^ ]* означает любое количество символов, которые не являются пробелами, поэтому оно соответствует символам после age : до следующего места.
замещать file с именем файла, который содержит ваши данные. Вы можете записать новый файл, перенаправив вывод в новый файл с > оператор, как это:
grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file > outfile
Когда вы сделаете это, вы не увидите никакого вывода. Сначала вы должны проверить вывод, а затем добавить перенаправление.
Вот пример с чередованием. Мы используем -E флаг, чтобы сказать grep использовать расширенное регулярное выражение. Синтаксис (pattern1|pattern2) - это соответствует pattern1 и / или pattern2, Если один из них найден, он будет напечатан (независимо от того, найден другой или нет). Я сейчас использую + то есть, по крайней мере, один из предшествующих символов вместо * означает ноль или более предыдущего символа. В этом контексте они оба работают одинаково хорошо.
$ grep -Eo '(age : [^ ]+|phone number : [^ ]+)' file
age : 23
phone number : 0123
Если вы хотите опустить age : а также phone number: части, вы можете использовать -P флаг спросить grep использовать Perl-совместимые регулярные выражения. Это поддерживает чередование, а также способ сопоставления текста после заданного шаблона:
$ grep -Po '(age : \K[^ ]+|phone number : \K[^ ]+)' file
23
0123
Если вы хотите отформатировать текст по-другому, вы можете использовать sed, например:
$ sed -r 's/.*(age) : ([^ ]*).*(phone number) : ([^ ]*).*/\1:\2 | \3:\4/' file
age:23 | phone number:0123
Это зависит от age до того phone numberтак что отрегулируйте соответственно, если это не так. Если вы не можете положиться на порядок, вы можете использовать эту очень запутанную команду:
$ sed -r 's/(.*)(phone number : [^ ]+)(.*) .*/\2 \1\4/; s/(phone number) : ([^ ]+) .*(age) : ([^ ]+).*/\1: \2 | \3: \4/' file
phone number: 0123 | age: 23
Это переставляет линию так, чтобы phone number : сначала идет раздел в каждой строке, затем выполняется вторая замена, чтобы выбрать нужные детали. Я обязан технике, использованной здесь, для этого ответа Муру.
Примечания о sed команды, не охваченные предыдущими пояснениями
-rиспользовать расширенное регулярное выражение для более удобочитаемых команд (GNUsedпонимает-Eс тем же значением)s/old/new/замещатьoldсnew(pattern)экономитpatternссылаться позже, с\1или же\2и т. д. (в соответствии с порядком слева направо, в котором встречаются группы захвата - обратите внимание, чтоsedбудет держать только до 7 из них!)..любой персонаж, поэтому.*представляет любое количество любых символов.;отделяет команды, как в оболочке.
Вы можете использовать grep для поиска регулярного выражения в файле details.txt и перенаправить результат в новый файл.
Если у всех строк, которые вы хотите скопировать, есть что-то общее, другие строки использовать нельзя:
grep "string in common" details.txt > new.txt
Если нет, вам придется искать каждую строку, которую вы хотите скопировать, все еще используя grep, и добавлять их в new.txt, используя >> вместо >,
Есть также редакторы, которые работают в терминале, например, nano, vi и emacs.
Если вы используете графический интерфейс пользователя на своем локальном компьютере и терминал на удаленном компьютере, вы также можете использовать мышь для копирования и вставки из одного окна / вкладки терминала во второе.
Предполагая входной файл details.txt содержит:
name: farah
age: 23
phone number: 0123
education: degree
Вы можете выбрать строки "имя" и "телефон" с помощью расширенного grep и перенаправить вывод в new.txt:
grep -E "age:|phone number:" details.txt > new.txt
Это создаст new.txt с:
age: 23
phone number: 0123
Как это устроено:
Grep печатает только совпадающие линии. -E опции включили расширенное регулярное выражение, которое дает вам возможность использовать | (Альтернативный вариант). Не забудьте процитировать весь шаблон, так | будет интерпретироваться grep. В противном случае оболочка попытается интерпретировать. Вы не хотите этого здесь.