这是一个真正有效的 sed-only 脚本。我在下面将其编写为 sed 在命令行上调用的文件,但它可以全部在命令行上键入,也可以全部输入到单独的脚本中:
将以下内容另存为 sedscript(或任何您想调用的名称)。解释跟在输出后面。
:start
h
s/\(.\ \ [^ ]*\).*/\1/
t continue
d
:continue
p
x
s/\(.\ \)\ [^ ]*\(\ .*\)/\1\2/
t start
d
现在运行sed -f sedscript myfile.txt
将上面的示例保存为 myfile.txt,输出如下:
a yao.com
a sina.com
b kongu.com
c polm.com
c unee.net
c 21cn.com
c iop.com
c foo.com
c bar.com
c baz.net
c happy2all.com
d kinge.net
Sed 有一个模式缓冲区(您通常在其中使用s/a/b/
各种命令)和一个保持缓冲区。在此脚本中,信息在保留缓冲区中来回交换,以在处理另一部分时保留一行中未编辑的部分。
:start
= 启用跳跃的标签
h
= 将模式缓冲区(当前行)交换到保持缓冲区
s/\(.\ \ [^ ]*\).*/\1/
= 虽然整行在保持缓冲区中是安全的,但删除第一个域之后的所有内容,留下第一个所需的行(例如“a yao.com”)。
t continue
= 如果上一个命令导致替换,则跳转到“继续”标签
d
=如果我们没有跳,那意味着我们已经完成了。删除模式缓冲区并继续到文件的下一行。
:continue
= 上一个跳转的标签
p
= 打印出模式缓冲区(例如“a yao.com”)
x
= 将模式缓冲区与保持缓冲区交换(也可g
用于简单地将保持缓冲区复制到模式缓冲区上)
s/\(.\ \)\ [^ ]*\(\ .*\)/\1\2/
= 完整的原始字符串现在已被交换到模式缓冲区 - 剥离我们刚刚处理的域(例如“yao.com”)
t start
= 如果这不是最后一个域,则使用新的缩短字符串重新开始脚本。
d
= 如果这是最后一个域,则删除模式缓冲区并继续到文件中的下一行。