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

У меня есть файл, содержащий мои персональные данные (.txt). Как может я с помощью терминальной копии только несколько деталей из файла и помещать детали в новое .txt файл?

Например, если это - содержание файла:

name : farah age : 23 phone number : 0123 education : degree

как я могу скопировать только возраст и номер телефона и произвести тех, которые к новому .txt файл?

11
задан 27 April 2018 в 09:28

5 ответов

Существует несколько способов сделать это. Если Ваш файл имеет некоторую известную структуру, можно использовать grep. grep управляйте ищет файл определенную фразу и возвращает строки то соответствие та фраза. Таким образом, если Ваш файл похож

Имя: Sally

Дата рождения: 7.31.76

Адрес: Main St, 1234.

SSN: 123-45-6789

можно работать grep Name info.txt и это возвратится Name: Sally. Можно затем перенаправить вывод в другой файл. Так вызов

grep Name info.txt > info2.txt

произведет строку в новый файл info2.txt. Если Вы хотите добавить новые строки, можно сделать

grep Address info.txt >> info2.txt

иначе файл будет перезаписан.

Вы могли также учиться использовать текстовый редактор командной строки как энергия.

7
ответ дан 23 November 2019 в 04:06

Можно использовать grep, чтобы искать регулярное выражение в details.txt и перенаправить результат в новый файл.

Если все строки, которые Вы хотите скопировать, имеют что-то общее, другие строки не делают можно использовать:

grep "string in common" details.txt > new.txt

Если не необходимо будет искать каждую строку, Вы хотите скопировать, все еще с помощью grep, и добавить их к использованию new.txt >> в земельном участке >.

2
ответ дан 23 November 2019 в 04:06

Существуют также редакторы, которые работают в терминале, например, нано, vi и emacs.

При использовании графического интерфейса пользователя на локальной машине и терминале на удаленной машине можно также использовать мышь, чтобы скопировать и вставить из одного окна терминала / вкладку к второй.

1
ответ дан 23 November 2019 в 04:06

Принятие входного файла 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 включенные опции расширили regexp, который дает Вам возможность использовать | (альтернатива). Не забудьте заключать целый шаблон в кавычки, таким образом, | будет интерпретироваться grep. Иначе оболочка попытается интерпретировать. Вы не хотите это здесь.

1
ответ дан 23 November 2019 в 04:06

Файл, который Вы показали, имеет все подробности об одной строке:

name : farah age : 23 phone number : 0123 education : degree

Я предположил, что Вы можете твердый код age : и т.д. в команду, но текст после него будет варьироваться, и что детали не могут быть в данном распоряжении или быть непрерывными.

Можно извлечь части строки с grep -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 использовать расширенный regex. Синтаксис (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 : раздел на первом месте на каждой строке, затем делает вторую замену для выбора желаемых деталей. Я должен технику, привыкшую здесь к этому ответу muru.

Примечания по sed команды, не покрытые предыдущими объяснениями

  • -r используйте расширенный regex для большего количества читаемых команд (GNU sed понимает -E с тем же значением)
  • s/old/new/ замена old с new
  • (pattern) сохраняет pattern к ссылке позже, с \1 или \2 и т.д. (соответствующий слева направо заказывают, в котором группы получения происходят - отмечают это sed будет только содержать 7 из них!).
  • . любой символ, поэтому .* представляет любое количество любых символов.
  • ; разделяет команды, как в оболочке.
1
ответ дан 23 November 2019 в 04:06

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

Похожие вопросы: