sed 's/ \([0-9]\)\/\([0-9]\) / \2\/\1 /' 文件名

sed 's/ \([0-9]\)\/\([0-9]\) / \2\/\1 /' 文件名

我能知道下面的代码是什么意思吗?

sed 's/ \([0-9]\)\/\([0-9]\) / \2\/\1 /' filename

谢谢

答案1

sed 's/ \([0-9]\)\/\([0-9]\) / \2\/\1 /' filename在大多数 Unix shell 中都是有效的代码。

在 shell 中,空格字符用于在语法中分隔标记,并'...'用于引用/逃脱对于 shell 来说意味着的字符串去除字符的特殊含义。在这种情况下,这意味着'...'shell 不会对其中的空格和反斜杠字符进行特殊处理。

第一个单词sedis 不是 shell 语法中的关键字,shell 会将该行解释为简单的命令调用。我将使用,和作为参数来fork 查找sed命令$PATH并执行它在子进程中找到的第一个命令。seds/ \([0-9]\)\/\([0-9]\) / \2\/\1 /filename

sed它本身就是另一种语言的解释器,即sed语言。

除非通过-e-f选项传递脚本,否则接收的第一个非选项参数sed将被视为要解释的脚本。

在这里,就是s/ \([0-9]\)\/\([0-9]\) / \2\/\1 /

sedfilename一次一行处理其输入(这里来自文件)(当前行加载到sed的模式空间中),并且对于每一行,解释提供的脚本中的代码并在 stdout 上打印结果模式空间。

在这里,该脚本由一个且仅有一个命令组成sedsubstitute 命令。

其语法是s%pattern%replacement%flags可以使用任何字符 来代替%

这里作者用/来代替%.这是最常用的,但在这里它是一个糟糕的选择,因为它/恰好在模式和替换中使用,因此必须使用 进行转义\

所以模式是" \([0-9]\)/\([0-9]\) ".在 中sed,模式是基本正则表达式(布雷)。在布雷:

  • SPC,/匹配自己,因为它们并不特殊
  • [set]匹配一个整理元素在指定的集合中。当该集合包含 时,它会匹配在和x-y之间排序的整理元素。对于,至少包括 0123456789 个字符,但可能更多,具体取决于区域设置、操作系统和实现。xy0-9sed
  • \(...\)用于分组,也用于捕获。也就是说,与内部内容相匹配的内容将是被捕获并提供在替代品至于\1第一个捕获组,\2第二个捕获组,等等。

这里的替换是" \2/\1 ",其中\2\1是模式中前 2 个捕获组所匹配的内容。

在您的情况下,标志列表为空,特别是由于未提供g(for global) 标志,因此每行仅替换第一个匹配项。

<SPC><a-digit><slash><another-digit><SPC>所以在这里,这意味着它在<SPC><another-digit><slash><a-digit><SPC>其中的每一行上最多替换一个filename,并将结果输出到标准输出上。

例如,afilename包含:

a 1/2 b 3/4
test
c4/5 6/7 d

它将输出:

a 2/1 b 3/4
test
c4/5 7/6 d

¹ 反斜杠和换行符以及多个sed实现的多字节字符除外。您还需要避免非 ASCII 字符,并且如果您需要模式或替换来包含非 ASCII 字符,即在其他字符中找不到编码的字符,实际上只有!"#$%&' ()*+,-./:;<=>?当我们也排除 ASCII 控制字符时才会留下这些字符。

相关内容