我能知道下面的代码是什么意思吗?
sed 's/ \([0-9]\)\/\([0-9]\) / \2\/\1 /' filename
谢谢
答案1
sed 's/ \([0-9]\)\/\([0-9]\) / \2\/\1 /' filename
在大多数 Unix shell 中都是有效的代码。
在 shell 中,空格字符用于在语法中分隔标记,并'...'
用于引用/逃脱对于 shell 来说意味着的字符串去除字符的特殊含义。在这种情况下,这意味着'...'
shell 不会对其中的空格和反斜杠字符进行特殊处理。
第一个单词sed
is 不是 shell 语法中的关键字,shell 会将该行解释为简单的命令调用。我将使用,和作为参数来fork 查找sed
命令$PATH
并执行它在子进程中找到的第一个命令。sed
s/ \([0-9]\)\/\([0-9]\) / \2\/\1 /
filename
sed
它本身就是另一种语言的解释器,即sed
语言。
除非通过-e
或-f
选项传递脚本,否则接收的第一个非选项参数sed
将被视为要解释的脚本。
在这里,就是s/ \([0-9]\)\/\([0-9]\) / \2\/\1 /
。
sed
filename
一次一行处理其输入(这里来自文件)(当前行加载到sed
的模式空间中),并且对于每一行,解释提供的脚本中的代码并在 stdout 上打印结果模式空间。
在这里,该脚本由一个且仅有一个命令组成sed
:s
ubstitute 命令。
其语法是s%pattern%replacement%flags
可以使用任何字符 来代替%
。
这里作者用/
来代替%
.这是最常用的,但在这里它是一个糟糕的选择,因为它/
恰好在模式和替换中使用,因此必须使用 进行转义\
。
所以模式是" \([0-9]\)/\([0-9]\) "
.在 中sed
,模式是基本正则表达式(布雷)。在布雷:
- SPC,
/
匹配自己,因为它们并不特殊 [set]
匹配一个整理元素在指定的集合中。当该集合包含 时,它会匹配在和x-y
之间排序的整理元素。对于,至少包括 0123456789 个字符,但可能更多,具体取决于区域设置、操作系统和实现。x
y
0-9
sed
\(...\)
用于分组,也用于捕获。也就是说,与内部内容相匹配的内容将是被捕获并提供在替代品至于\1
第一个捕获组,\2
第二个捕获组,等等。
这里的替换是" \2/\1 "
,其中\2
和\1
是模式中前 2 个捕获组所匹配的内容。
在您的情况下,标志列表为空,特别是由于未提供g
(for g
lobal) 标志,因此每行仅替换第一个匹配项。
<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 控制字符时才会留下这些字符。