如何理解sed脚本编程中的美元符号($)?
大家好。 我不理解sed脚本编程中的美元符号($),它代表文件的最后一行或sed的计数器? 我想反转/etc/passwd的行顺序(模拟“tac”)。例如:如何理解sed脚本编程中的美元符号($)?,sed,Sed,大家好。 我不理解sed脚本编程中的美元符号($),它代表文件的最后一行或sed的计数器? 我想反转/etc/passwd的行顺序(模拟“tac”)。例如: $ cat /etc/passwd | wc -l ----> 52 // line numbers $ sed '1!G;h;$!d' /etc/passwd | wc -l ----> 52 // working correctly $ sed '1!G;h;$d' /etc/passwd | wc -
$ cat /etc/passwd | wc -l ----> 52 // line numbers
$ sed '1!G;h;$!d' /etc/passwd | wc -l ----> 52 // working correctly
$ sed '1!G;h;$d' /etc/passwd | wc -l ----> 1326 // no ! followed by $
$ sed '1!G;h;$p' /etc/passwd | wc -l ----> 1430 // instead !d by p
最后两个例子不正确,谁能告诉我美元符号代表什么意思?所有的命令都“正常工作”。它们只是做了一些你意想不到的事情。让我们考虑第一个版本:
sed '1!G;h;$!d
从前两个命令开始:
1!G; h
执行这两个命令后,模式空间和保持空间都包含到目前为止读取的所有行,但顺序相反
此时,如果我们什么也不做,sed
将执行其默认操作,即打印模式空间。因此:
- 读取第一行后,它将打印第一行
- 读取第二行后,它将打印第二行,然后再打印第一行
- 读取第三行后,它将打印第三行,然后是第二行,最后是第一行
- 等等
tac
,我们不希望这样。我们希望它只在读完最后一行之后才打印。因此,这就是以下命令的作用:
$!d
$
表示最后一行<代码>$代码>表示不是最后一行<代码>$!d如果我们不在最后一行,则表示删除。因此,这会告诉sed
删除图案空间,除非我们在最后一行,在这种情况下,它将被打印,以相反的顺序显示所有行
考虑到这一点,考虑你的第二个例子:
sed '1!G;h;$d'
sed '1!G;h;$p'
这将打印除最后一个以外的所有部分tac
s
你的第三个例子:
sed '1!G;h;$d'
sed '1!G;h;$p'
这将打印最后一行的所有部分tac
s,但最后一行会打印两次:$p
是最后一行的模式空间的显式打印,另外还有可能发生的隐式打印。所有命令都“正常工作”。它们只是做了一些你意想不到的事情。让我们考虑第一个版本:
sed '1!G;h;$!d
从前两个命令开始:
1!G; h
执行这两个命令后,模式空间和保持空间都包含到目前为止读取的所有行,但顺序相反
此时,如果我们什么也不做,sed
将执行其默认操作,即打印模式空间。因此:
- 读取第一行后,它将打印第一行
- 读取第二行后,它将打印第二行,然后再打印第一行
- 读取第三行后,它将打印第三行,然后是第二行,最后是第一行
- 等等
tac
,我们不希望这样。我们希望它只在读完最后一行之后才打印。因此,这就是以下命令的作用:
$!d
$
表示最后一行<代码>$代码>表示不是最后一行<代码>$!d如果我们不在最后一行,则表示删除。因此,这会告诉sed
删除图案空间,除非我们在最后一行,在这种情况下,它将被打印,以相反的顺序显示所有行
考虑到这一点,考虑你的第二个例子:
sed '1!G;h;$d'
sed '1!G;h;$p'
这将打印除最后一个以外的所有部分tac
s
你的第三个例子:
sed '1!G;h;$d'
sed '1!G;h;$p'
这会从最后一行打印出所有部分的
tac
s,但最后一行会打印两次:$p
是最后一行的图案空间的显式打印,另外还有可能发生的隐式打印。根据使用位置和方式,$
符号有不同的含义。如果用作“行号”,则表示“最后一行”。如果在正则表达式中使用,它通常表示“行结束”,但有时表示美元符号(如果它位于正则表达式的中间)。如果您不小心在sed脚本参数周围使用了双引号而不是单引号,那么$
由shell解释,而不是由sed
解释。$
符号的可能重复项根据其使用位置和方式具有不同的含义。如果用作“行号”,则表示“最后一行”。如果在正则表达式中使用,它通常表示“行结束”,但有时表示美元符号(如果它位于正则表达式的中间)。如果您不小心在sed脚本参数周围使用了双引号而不是单引号,那么$
是由shell解释的,而不是由sed
解释的,它是用来清除图案空间的,以前我只是认为它是用来删除文件中匹配的行,这是错误的!我现在明白“d”命令的意思了,它是用来清除图案空间的。以前我只是认为它是用来删除文件中匹配的行,这是错误的!