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

У меня есть файл, содержащий мои личные данные (.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 использовать расширенное регулярное выражение для более удобочитаемых команд (GNU sed понимает -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. В противном случае оболочка попытается интерпретировать. Вы не хотите этого здесь.

Другие вопросы по тегам