如何有选择地从文件中复制详细信息并将其粘贴到新文件中?


11

我有一个包含我的个人详细信息(.txt)的文件。如何通过终端从文件中复制一些详细信息,然后将其放入新.txt文件中?

例如,如果这是文件的内容:

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

如何仅复制年龄和电话号码并将其输出到新.txt文件?


2
这取决于您要复制到新文件的内容。您是否想要前几行,后几行,两个字符串之间的行包含一个字符串,而不包含一个字符串?有工具可以执行所有这些操作,但是我们需要知道您想做什么。
Arcege”

Answers:


7

有几种方法可以做到这一点。如果文件具有某些已知结构,则可以使用grep。该grep命令在文件中搜索特定短语,并返回与该短语匹配的行。因此,如果您的文件看起来像

姓名:Sally

出生日期: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)。


2

您可以使用grepdetails.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

您可以通过扩展grep选择行“名称”和“电话”,并将输出重定向到new.txt:

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

这将产生带有以下内容的new.txt:

age: 23
phone number: 0123

怎么运行的:

Grep仅打印匹配的行。-E启用扩展正则表达式的选项使您可以使用|(替代)。请记住引用整个模式,因此|将由grep解释。否则,shell将尝试解释。你不要这个


1

您显示的文件在一行上包含所有详细信息:

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

我假设您可以将age :etc等硬编码到命令中,但是其后的文本将有所不同,并且详细信息可能未按给定顺序或连续。

您可以使用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使用扩展正则表达式。语法是(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将扩展的正则表达式用于更易读的命令(GNU sed理解-E具有相同的含义)
  • s/old/new/替换oldnew
  • (pattern)保存后pattern供参考,用\1\2等(对应于捕获组从左到右的顺序-请注意sed最多只能容纳其中的7个!)。
  • .任何字符,因此.*代表任意数量的任何字符。
  • ; 像在shell中一样分隔命令。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.