Sed + 如何在 sed 命令中设置参数以显示文本文件中的行

Sed + 如何在 sed 命令中设置参数以显示文本文件中的行

我找到以下方法从文件中打印行

在此示例中,我们要打印主机文件中的第一行

sed -n '1,1p'  /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

但是如何对 sed 命令中的参数执行相同的操作

例如

Line_number=1
sed -n ' $Line_number,$Line_numberp'  /etc/hosts
 sed: -e expression #1, char 4: extra characters after command

我的 sed 语法有什么问题?

答案1

让您的 shell 使用 " 而不是 ' 来扩展变量。

例子:

victor@pyfg:~$ line_number=2
victor@pyfg:~$ sed -n "${line_number},${line_number}p" /etc/hosts
1.2.3.4 row-2

由于您只打印一行,因此您也可以这样打印:

victor@pyfg:~$ sed -n "${line_number}p" /etc/hosts
1.2.3.4 row-2

答案2

只是为了好玩,一个 awk 解决方案:

awk -v line=2 'FNR==line' /etc/hosts

答案3

q在您的示例中,一旦您发现打印了所需的数据,最好使用 sed uit 输入文件。例如:

sed 1q <INPUT

这将自动打印第一行,然后完全结束该过程。您还可以这样做:

head -n1 <INPUT

...达到相同的效果。

sed但也可以解释address,ranges,并且这些也可以是/regex/,/addresses/两种类型的组合。例如:

sed '9q;/LINE[0-9]/,/^$/!d' <<FILE
$(printf 'LINE %s\nLINE%s\nLINE %s\\nNOT LINE %s\n\n' $(seq 32))
FILE

###OUTPUT###

LINE2
LINE 3\nNOT LINE 4

LINE6
LINE 7\nNOT LINE 8

LINE 9

在上面的示例中sed d,删除它遇到的任何不在包含紧随其后的!字符串或任何数字字符的行与根本不包含任何字符或空行的行之间的任何行。这样,第 1 行和第 5 行 - or就从其输出中删除。相反,因为它被指示在 9 上,所以它会在该点停止处理其脚本 - 这发生在将删除它的过滤器之前,因此被打印。LINE[0-9]/^$/LINE [15]LINE 9q

正如另一个答案中所建议的,处理变量参数就像允许 shell 为您扩展它们一样简单 - 因此您应该使用“$parameter”来执行此操作。重要的是要记住,无效输入将被视为无效输入。例如,出于同样的原因:

echo "///" | sed 's////g'     
sed: -e expression #1, char 5: unknown option to `s'

...也不:

v=/ ;echo "///" | sed "s/$v//g"                                 :(
sed: -e expression #1, char 5: unknown option to `s'

每个变量的值必须是有效的sed脚本,并且不能包含其分隔符。

相关内容