使用 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 ...