假设文件names
包含以下形式的姓名列表:“名字姓氏”,每行一个。这些名字未排序,您希望它们按姓氏排序。但是,每行上的名称格式应保持不变。哪个一以下命令将不是将适当排序的名称列表输出到控制台?
[ ]cut -f 2 -d " " names | paste names - | sort -k 3 | cut -f 1
[x]sort -k 2 names
← 错误答案
[ ]sed 's/\(\w*\) \(\w*\)/\2 \1 \2/' names | sort | cut -f 2-3 -d " "
[ ]cut -f 2 -d " " names | sort
[ ]cut -f 2 -d " " names | paste - names | sort | cut -f 2
我不明白以下内容如何产生请求的输出:
sed 's/\(\w*\) \(\w*\)/\2 \1 \2/' names | sort | cut -f 2-3 -d " "
IE 按姓氏字母顺序对名称进行排序,但保留“名字姓氏”的格式。\w
接下来的工作如何*
?我认为文件名后面必须有一个空格。这里又如何\w
应用呢?
答案1
请注意,以下仅适用于 GNU sed
; BSD 的sed
行为会有所不同。
好的,让我们一步一步来,将其用于以下内容names
:
Alice Zylanzy
Zepher Applecart
Michael Copperside
我们将使用该命令并逐个查看它,看看它是如何工作的:
$ sed 's/\(\w*\) \(\w*\)/\2 \1 \2/' names
Zylanzy Alice Zylanzy
Applecart Zepher Applecart
Copperside Michael Copperside
因此该sed
命令会在该行的前面添加一个重复的姓氏。然后我们做一个简单的sort
:
$ sed 's/\(\w*\) \(\w*\)/\2 \1 \2/' names | sort
Applecart Zepher Applecart
Copperside Michael Copperside
Zylanzy Alice Zylanzy
太酷了,现在它们按姓氏排序。现在我们用来cut
摆脱我们使用的前缀:
$ sed 's/\(\w*\) \(\w*\)/\2 \1 \2/' names | sort | cut -f 2-3 -d " "
Zepher Applecart
Michael Copperside
Alice Zylanzy
..正如他们所说,鲍勃是你的叔叔。
进入杂草丛中如何该sed
命令有效: \w
是一个魔法咒语,意思是“单词字符”,是 的简写/[0-9A-Za-z_]/
。 \w*
只是意味着零个或多个“单词字符”,这就是名称的分组方式。假设所有名称中都没有下划线或数字,则可以将其重写为:
sed 's/\([A-Za-z]*\) \([A-Za-z]*\)/\2 \1 \2/' names
sed
逐段分解整个命令:
sed 命令s
是“搜索和替换”或“替换”命令。第一个和第二个 s 之间的表达式/
替换为第二个和第三个/
s 之间的表达式。
所以我们要替换这个:
NODE EXPLANATION
--------------------------------------------------------------------------------
( group and capture to \1:
\w* word characters (a-z, A-Z, 0-9, _) (0 or
more times (matching the most amount
possible))
) end of \1
' '
( group and capture to \2:
\w* word characters (a-z, A-Z, 0-9, _) (0 or
more times (matching the most amount
possible))
) end of \2
有了这个:
NODE EXPLANATION
--------------------------------------------------------------------------------
\2 what was matched by capture \2
' '
\1 what was matched by capture \1
' '
\2 what was matched by capture \2