了解“sed”命令

了解“sed”命令

假设文件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

相关内容