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