如何理解sed脚本编程中的美元符号($)?

如何理解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 -

大家好。 我不理解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 -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”命令的意思了,它是用来清除图案空间的。以前我只是认为它是用来删除文件中匹配的行,这是错误的!