从某行开始,每n行替换

时间:2019-08-06 09:14:27

标签: awk sed replace

我想从第二行开始使用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'

这只会从头开始每隔两行替换一次。

4 个答案:

答案 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