我想从第二行开始使用sed替换每三行。
Input file
A1
A2
A3
A4
A5
A6
A7
.
.
.
Expected output
A1
A2
A3
A4_edit
A5
A6
A7_edit
.
.
.
我知道有很多解决方案可以在堆栈上找到,但是对于这个特定的问题,我找不到。
我的尝试:
sed '1n;s/$/_edit/;n'
这只会从头开始每隔两行替换一次。
答案 0 :(得分:2)
像这样吗?
$ seq 10 | sed '1b ; n ; n ; s/$/_edit/'
1
2
3
4_edit
5
6
7_edit
8
9
10_edit
这分解为一个循环
1b
(如果这是输入中的第一行),请开始下一个循环,使用sed
的默认行为来打印该行并读取下一个-跳过输入中的第一行< / li>
n
打印当前行并读取下一行-跳过三行一组中的第一行n
打印当前行并读取下一行-跳过三行一组中的第二行s/$/_edit/
在每三个一组的第三行上用行尾_edit
代替sed
行为进行打印,阅读下一行并重新开始循环如果您想一开始跳过多行,请将1b
更改为1,5b
。
正如Wiktor Stribiewew在评论中指出的那样,作为替代方案,有一个GNU范围扩展 first
~
step
允许我们写
sed '4~3s/$/_edit/'
这意味着从第4行开始,每三行替换一次。
答案 1 :(得分:2)
如果您对awk
感到满意,请尝试执行以下操作。
awk -v count="-1" '++count==3{$0=$0"_edit";count=0} 1' Input_file
如果要将输出保存到Input_file本身,请附加> temp_file && mv temp_file Input_file
。
说明:
awk -v count="-1" ' ##Starting awk code here and mentioning variable count whose value is -1 here.
++count==3{ ##Checking condition if increment value of count is equal to 3 then do following.
$0=$0"_edit" ##Appending _edit to current line value.
count=0 ##Making value of count as ZERO now.
} ##Closing block of condition ++count==3 here.
1 ##Mentioning 1 will print edited/non-edited lines.
' Input_file ##Mentioning Input_file name here.
答案 2 :(得分:1)
另一个const f1 = (cb) => {
return new Promise ((resolve) => setTimeout(() => {
resolve(cb(null, { a: 1 }))
}, 100))
};
const f2 = (cb) => {
return new Promise ((resolve) => setTimeout(() => {
resolve(cb(null, { a: 2 }))
}, 50))
};
const f3 = (cb) => {
return new Promise ((resolve) => setTimeout(() => {
resolve(cb(null, { a: 3 }))
}, 10))
};
function parallelConsole(arr, cb) {
return Promise.all(arr)
.then((values) => {
cb(null, values);
});
}
const log = (err, data) => {
if (err) {
// TODO: handle properly
return console.log(err);
}
return data;
};
parallelConsole([f1(log), f2(log), f3(log)], (err, res) => {
console.log(res)
});
awk
awk 'NR>3&&NR%3==1{$0=$0"_edit"}1' file
A1
A2
A3
A4_edit
A5
A6
A7_edit
A8
A9
A10_edit
A11
A12
A13_edit
测试行是否大于3
NR>3
和每三行
NR%3==1
编辑该行
{$0=$0"_edit"}
打印所有内容
答案 3 :(得分:1)
您可以使用sed ~
步骤运算符。
sed '4~3s|$|_edit|'
~
是GNU sed的功能,因此它将在Linux的大多数(全部)发行版中可用。但是要在macOS(BSD sed随附)上使用它,则必须安装GNU sed才能获得此功能:brew install gnu-sed
。