Answers:
有几种方法可以做到这一点。如果文件具有某些已知结构,则可以使用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)。
假设输入文件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将尝试解释。你不要这个
您显示的文件在一行上包含所有详细信息:
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/
替换old
为new
(pattern)
保存后pattern
供参考,用\1
或\2
等(对应于捕获组从左到右的顺序-请注意sed
最多只能容纳其中的7个!)。.
任何字符,因此.*
代表任意数量的任何字符。;
像在shell中一样分隔命令。