如何从文件中删除不包含点的行?

Jaf*_*son 10 command-line text-processing

我有一个文件,其中包含包括 url 在内的数据。但是有很多行不是 url。如何使用 Ubuntu 终端命令删除它们?

这是供参考的示例文件:示例数据

com.blendtuts/S
°=
com.blengineering.www/:http
±=
Run Code Online (Sandbox Code Playgroud)

我想要输出:

com.blendtuts/S
com.blengineering.www/:http
Run Code Online (Sandbox Code Playgroud)

多余的不需要的行没有任何点。因此,我想删除没有点的线条

Zan*_*nna 31

一种方式 sed

sed '/\./!d' file
Run Code Online (Sandbox Code Playgroud)
  • /\./匹配文字点(转义,\因为否则.匹配任何字符)
  • !d 删除除匹配模式之外的所有内容

如果要就地编辑文件,请-i在测试后添加到命令中。(您还可以添加.bak-i标志sed -i.bak ...以创建文件的本地备份。)

sed -i '/\./!d' file
Run Code Online (Sandbox Code Playgroud)


Fl.*_*pf. 26

您可以将带有点的所有内容 grep 到一个新文件中:

grep "\."  file > newfile
Run Code Online (Sandbox Code Playgroud)

这样您就可以保存旧文件。


αғs*_*нιη 10

或者保留包含的行,

sed -ni.bak '/\./p' infile
Run Code Online (Sandbox Code Playgroud)


fed*_*qui 8

我认为awk是党缺少的最后一个:

$ awk -F\. 'NF>1' file
com.blendtuts/S
com.blengineering.www/:http
Run Code Online (Sandbox Code Playgroud)

这将字段分隔符设置为点。然后,打印那些至少有两个字段的行是一个问题:这意味着至少出现一个点。

  • 一个更简单的 awk 解决方案是按照与 grep 相同的方式进行操作:`awk '/\./' file` —— 也就是说,只打印包含字符 '.' 的行。 (3认同)

abl*_*igh 6

使用 perl:

perl -i -ne 'print if /\./' /path/to/file
Run Code Online (Sandbox Code Playgroud)


小智 6

你可以用 vim 很容易地做到这一点。如果您习惯使用 vim 作为文本编辑器(打开、编辑和写入文件),请执行以下操作:

:g!/\./d
Run Code Online (Sandbox Code Playgroud)

如果您不习惯使用 vim,或者您更愿意将其用作命令行工具,您可以直接从终端执行:

vim file -c "g!/\./d" -c "wq"
Run Code Online (Sandbox Code Playgroud)

您可以稍微修改它以保存到新文件:

vim file -c "g!/\./d" -c "w newfile" -c "q!"
Run Code Online (Sandbox Code Playgroud)

这使用 vim 的“全局”命令,它将 ex 命令应用于匹配(或不匹配)正则表达式的每一行。在这种情况下,命令是“(d)elete”,它将应用于每个不匹配正则表达式的命令\.