sed 删除所有内容,直到并包括第一个句点(如果该行上有多个句点)并对整个文件执行此操作

sed 删除所有内容,直到并包括第一个句点(如果该行上有多个句点)并对整个文件执行此操作

sed如果该行上有多个句点,则删除直到并包括第一个句点的所有内容,并对整个文件执行此操作。

在 sed 之前:

akamai.com
cdnjs.cloudflare.com
com.cdn.cloudflare.net

sed 之后:

akamai.com
cloudflare.com
cdn.cloudflare.net

答案1

$ sed '/\..*\./s/^[^.]*\.//' file
akamai.com
cloudflare.com
cdn.cloudflare.net

sed脚本首先使用正则表达式匹配包含至少两个点的行\..*\.(也可以编写为[.].*[.])。对于与此匹配的行,将执行删除所有内容(直到第一个点)的替换。

使用awk,与上面相比有点冗长:

$ awk -F '.' -vOFS='.' 'NF > 2 { n=split($0, a); $0=""; for (i=2;i<=n;++i) $(NF+1)=a[i] } 1' file
akamai.com
cloudflare.com
cdn.cloudflare.net

在这里,只要有两个以上的点分隔字段,我们就会将当前行按点分割,然后从中重新创建当前记录,跳过第一个字段。1末尾的尾随会导致打印每一行(无论是否修改)。

awk以与解决方案相同的方式更短sed

$ awk -F '.' 'NF > 2 { sub("^[^.]*\.", "") } 1' file
akamai.com
cloudflare.com
cdn.cloudflare.net

答案2

您可以使用以下方法来解决此问题:

perl -lpe '$_ = $1 if /\.(.*\..*)/' input-file.txt

其中,我们依赖regex于一个点.字符,它可以看到它右边的另一个点。然后,右侧的内容将被捕获并提供$1并填充到当前行中。-p然后,选项会将Perl其带到stdout以及不匹配的选项。


perl -F\\. -pale '$_ = join ".", splice @F, 1 if @F > 2' input.txt
  • 输入文件通过该选项逐行读取-p,自动打印也通过该选项打开。

  • 每个记录在点上分割.,并且存储在数组中的各个字段通过选项@F开始索引。0-a

  • -l选项使RS = ORS = "\n"

  • 仅当数组中的元素超过 2 个时@F,即当前记录中至少有 2 个点时,我们才会选择这样的记录进行修改。

  • 对于这样的记录,该splice @F, 1函数会剥离第二个元素,并将它们呈现给函数join,然后使用点字符将它们连接起来,然后将其填充到$_当前记录中。

  • 然后,该-p选项将修改后的当前记录带到 stdout。未修改的记录无论如何都会被静默带到 stdout。


使用GNU sed我们也可以在不使用捕获括号的情况下完成任务:

sed -e 
    s/\./\n/2;T
    y/\n./.\n/
    s/\n/./2g
    s/.*\n//
' input.file

输出:

akamai.com
cloudflare.com
cdn.cloudflare.net

相关内容