我在遇到特定情况时遇到麻烦。如果我的文件中充满以下条目:
my.site.example.com
somelinewithnodot
some.line .with.a.weird.space..this.is
this.one.has , and.stuff*.all.I
&&&83%23^&4,I;dont,even.need.2see
使用bash,我如何使用awk或sed之类的东西,或以“。”分隔每一行上的数据。然后仅在最后“。”之前和之后直接打印条目,而忽略不带“。”的行。
所需的输出:
example.com
somelinewithnodot
this.is
all.I
need.2see
我一直在尝试使用sed,但是在设置正则表达式时遇到了麻烦。我之前已经做过这样的事情,但是已经一分钟了,我在记住如何正确设置它上遇到麻烦...
答案 0 :(得分:4)
请您尝试以下。
awk -F'.' 'NF>1{print $(NF-1) FS $NF;next} 1' Input_file
OR
awk 'BEGIN{FS=OFS="."}NF>1{print $(NF-1) FS $NF;next} 1' Input_file
OR
awk -F'.' 'NF>1{$0=$(NF-1) FS $NF} 1' Input_file
OR
awk 'BEGIN{FS=OFS="."}NF>1{print $(NF-1) FS $NF;next} 1' Input_file
答案 1 :(得分:2)
您可以使用sed代替:
sed 's/^\([^.]*\.\)*\([^.]\+\.[^.]\+\)$/\2/'
答案 2 :(得分:1)
这可能对您有用(GNU sed):
sed -E 's/.*[.](.*[.].*)$/\1/' file
匹配最后两个.
,并用最后一个.
和两边的单词替换。
替代:
sed 's/.*\.\(.*\..*\)$/\1/' file
答案 3 :(得分:1)
您也可以尝试Perl
perl -ne ' /(^[^\.]+$)|(?<=\.)([^\.]+\.[^\.]+$)/g and print "$1$2" '
带有输入
$ cat johnred.txt
my.site.example.com
somelinewithnodot
some.line .with.a.weird.space..this.is
this.one.has , and.stuff*.all.I
&&&83%23^&4,I;dont,even.need.2see
$ perl -ne ' /(^[^\.]+$)|(?<=\.)([^\.]+\.[^\.]+$)/g and print "$1$2" ' johnred.txt
example.com
somelinewithnodot
this.is
all.I
need.2see
$
.
在[]中使用时失去其特殊含义,因此您可以使用
perl -ne ' /(^[^.]+$)|(?<=\.)([^.]+\.[^.]+$)/g and print "$1$2" ' johnred.txt
使用数组操作的另一种解决方案
perl -lne ' @b=$_=~/([^.]+)/g ; print $b[-2]? "$b[-2].":"", $b[-1] ' johnred.txt