У меня есть файл, содержащий мои персональные данные (.txt). Как может я с помощью терминальной копии только несколько деталей из файла и помещать детали в новое .txt
файл?
Например, если это - содержание файла:
name : farah age : 23 phone number : 0123 education : degree
как я могу скопировать только возраст и номер телефона и произвести тех, которые к новому .txt
файл?
Существует несколько способов сделать это. Если Ваш файл имеет некоторую известную структуру, можно использовать 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
иначе файл будет перезаписан.
Вы могли также учиться использовать текстовый редактор командной строки как энергия.
Можно использовать grep, чтобы искать регулярное выражение в details.txt и перенаправить результат в новый файл.
Если все строки, которые Вы хотите скопировать, имеют что-то общее, другие строки не делают можно использовать:
grep "string in common" details.txt > new.txt
Если не необходимо будет искать каждую строку, Вы хотите скопировать, все еще с помощью grep, и добавить их к использованию new.txt >>
в земельном участке >
.
Существуют также редакторы, которые работают в терминале, например, нано, 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
включенные опции расширили regexp, который дает Вам возможность использовать |
(альтернатива). Не забудьте заключать целый шаблон в кавычки, таким образом, |
будет интерпретироваться grep. Иначе оболочка попытается интерпретировать. Вы не хотите это здесь.
Файл, который Вы показали, имеет все подробности об одной строке:
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 из них!)..
любой символ, поэтому .*
представляет любое количество любых символов.;
разделяет команды, как в оболочке.