如何查找单词并仅更改下一个第二行单词

如何查找单词并仅更改下一个第二行单词

文件名staff.txt和示例内容为:

JHON
MANAGER
10000

我想JHON在一个文件中查找并想用另一个单词/数字更改该行之后第二行的内容。

我怎样才能做到这一点?

答案1

使用ed,伙计!

ed -s staff.txt <<< $'/JHON/+2s/.*/4242\nw\nq'

-s这会在文件上以脚本模式 ( )调用 ed staff.txt,并在 ANSI 引用的此处字符串中向其发送以下命令:

  • 找到包含 ( )的行JHON并超出该行两行+2
  • .*在那一行上,搜索并替换 ( )中的所有内容4242
  • w将文件写入磁盘
  • q伊特编辑

中间\n的 分隔不同的ed命令。

或者,您可以使用以下c命令更改行:

ed -s staff.txt <<< $'/JHON/+2c\n4242\n.\nw\nq'

此处,替换文本需要单独(在c命令之后)输入,并以句点结尾 ( \.\n)。

答案2

您可以使用sed以下命令移动到下一行n

sed '/JHON/{n;n;s/.*/42/}'

答案3

使用awk

awk 'f{$0="newvalue";f=0}/JHON/{print;getline;f=1}1'

f{$0="newvalue";f=0}- 如果f为 true,则将线路设置为newvalue并重置f0

/JHON/{print;getline;f=1}- 如果JHON找到模式打印它,打印下一行,并设置f1

1- 打印

答案4

如果您只有一个人(一个注册者),您可以使用此代码:

awk '/JHON/{print $0; getline; print "SUPERVISOR"; getline; print "99999"; }' staff.txt

如果您的staff.txt文件有很多人(很多寄存器)并且您应该仅替换 JHON 数据:

awk '/.*/{if($0=="JHON"){print $0; getline; print "SUPERVISOR"; getline; print "99999"; } else {print $0;}}' staff2.txt

示例staff2.txt

JHON
MANAGER
10000
ROGER
TEACHER
3000
ROBERT
SCIENTIST
20000

你应该得到这个输出:

JHON
SUPERVISOR
99999
ROGER
TEACHER
3000
ROBERT
SCIENTIST
20000

获得相同输出的另一种简短方法可能是:

awk '/JHON/{print;getline; print "SUPERVISOR"; getline; $0="99999"}1' staff2.txt

说明:如果行是JHON,则打印JHON,转到下一行,打印SUPERVISOR,转到下一行,将其替换为99999。如果行不是JHON,则仅打印它。

相关内容