Як вибірково скопіювати деталі з файлу та вставити їх у новий файл?


11

У мене є файл, який містить мої особисті дані (.txt). Як я можу через термінал скопіювати лише кілька реквізитів із файлу та помістити їх у новий .txtфайл?

Наприклад, якщо це вміст файлу:

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

як я можу скопіювати лише вік та номер телефону та вивести їх у новий .txtфайл?


2
Це залежить від того, що ви хочете скопіювати в новий файл. Ви хочете, щоб перші кілька рядків, останні кілька, рядки, що містять рядок, не містять рядки, між двома рядками? Є інструменти, щоб зробити все це, але ми повинні знати, що ви хочете зробити.
Арседж

Відповіді:


7

Існує кілька способів зробити це. Якщо ваш файл має якусь відому структуру, ви можете використовувати grep. У grepкоманді шукає файл для конкретної фрази і повертають рядки , які відповідають цій фразі. Тож якщо ваш файл виглядає так

Назва: Саллі

Дата народження: 7,31,76

Адреса: 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

інакше файл буде перезаписаний.

Ви також можете навчитися користуватися редактором тексту командного рядка, наприклад, vim.


2

Ви можете використовувати grep для пошуку регулярного виразу в details.txt і перенаправлення результату на новий файл.

Якщо всі рядки, які ви хочете скопіювати, мають щось спільне, інші рядки ви не можете використовувати:

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

Якщо ні, вам доведеться шукати кожен рядок, який ви хочете скопіювати, все ще використовуючи grep, і додайте їх до new.txt, використовуючи >>замість >.


1

Є також редактори, які працюють у терміналі, наприклад, nano, vi та emacs.

Якщо ви використовуєте графічний інтерфейс користувача на своїй локальній машині та термінал на віддаленій машині, ви також можете скористатися мишкою для копіювання та вставки з одного вікна / вкладки термінала на другий.


1

Якщо вхідний файл details.txtмістить:

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

Ви можете вибрати рядки "ім'я" та "телефон" за допомогою розширеного зображення та переадресації на new.txt:

grep -E "age:|phone number:" details.txt > new.txt

Це створить new.txt з:

age: 23
phone number: 0123

Як це працює:

Греп друкує лише відповідні лінії. Ці -Eопції дозволили розширеної регулярному_вираженію , який дає вам можливість використовувати |(альтернативи). Не забудьте процитувати цілий зразок, тому |він буде інтерпретований грепом. Інакше оболонка спробує інтерпретувати. Ви цього не хочете.


1

Файл, який ви показали, містить усі деталі в одному рядку:

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 з них!).
  • .будь-який символ, тому .*представляє будь-яку кількість будь-яких символів.
  • ; відокремлює команди, як у оболонці.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.