删除行的 Sed 命令 - 变量

删除行的 Sed 命令 - 变量

使用 sed 命令,我想从总共 99 行的文件中每隔三行删除一次。我的意思是保留前三行并删除后三行,依此类推。

我的启动脚本如下:

for i in `seq 1 6 99`; do
   sed '$i,${i+2}!d' test.txt > o$i.txt
done
cat o*.txt > O.txt
rm o*.txt

我个人工作很好,喜欢

sed '1,3!d' test.txt > o1.txt
sed '7,9!d' test.txt > o7.txt
...

但它在 sed 中不起作用。您能让我知道我做错了什么吗?谢谢

答案1

正如中所暗示的评论,您需要在 sed 调用中正确引用变量:

for i in $(seq 1 6 99); do
    sed "$i"','"$((i+2))"'!d' test.txt > "o$i.txt"
done

您的变量不会在单引号中展开并按字面意思理解($i= 在最后一行之前插入)。扩展使用双引号(在此示例中没有引号也适用),您需要$((…))进行算术评估并输出其结果。脚本的其余部分仍保留在单引号中。

您还应该使用更新的$(…)语法进行命令替换,而不是使用已弃用的反引号`…`,这使得引用更容易。这里有一个好例子


但你可以使用 GNUsed第一步~第一步运算符而不是循环:

sed '4~6{N;N;d}' file

例子:

$ seq 20 | sed '4~6{N;N;d}'
1
2
3
7
8
9
13
14
15
19
20

解释:

sed '4~6d'将删除第 4 行,然后删除第 6 行 10、16、22 ...

删除{N;N;d}另外两行,即 4、5、6,然后是 10、11、12 ...

相关内容