我正在尝试从文件中打印每个n
行,但n
不是常量而是变量。
例如,我想用sed -n '1~5p'
替换sed -n '1~${i}p'
。
这可能吗?
答案 0 :(得分:7)
awk
也可以更优雅的方式完成:
awk -v n=YOUR_NUM 'NR%n==1' file
使用-v n=YOUR_NUM
表示号码。然后,NR%n==1
在行号为7n+1
的情况下评估为true,因此它会打印该行。
请注意使用awk
对此有多好:如果您想要7n+k
表单上的行,则只需执行:awk -v n=7 'NR%n==k' file
。
让我们每7行打印一次:
$ seq 50 | awk -v n=7 'NR%n==1'
1
8
15
22
29
36
43
50
或sed
:
$ n=7
$ seq 50 | sed -n "1~$n p" # quote the expression, so that "$n" is expanded
1
8
15
22
29
36
43
50
答案 1 :(得分:7)
关键是,您应该使用双引号"
而不是单引号来包装您的sed代码。变量不会在单引号内扩展。这样:
sed -n "1~${i} p"
答案 2 :(得分:1)
你可以这样做,例如:
i=3
sed "2,${i}s/.*/changed line/g" InputFile
示例:强>
AMD$ cat File
aaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffff
ggggggggggggggggggggg
AMD$ i=4; sed "2,${i}s/.*/changed line/g" File
aaaaaaaaaaaaaaaaaaaaaaaa
changed line
changed line
changed line
eeeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffff
ggggggggggggggggggggg
关键是使用" "
进行变量替换。
答案 3 :(得分:0)
为什么选择sed?
head -${i} YourFile