Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在两个字符串语句之间插入新字符串_Linux_Bash_Shell_Awk_Terminal - Fatal编程技术网

Linux 在两个字符串语句之间插入新字符串

Linux 在两个字符串语句之间插入新字符串,linux,bash,shell,awk,terminal,Linux,Bash,Shell,Awk,Terminal,我有许多多行文本文件,格式为 222 333 444 _benny 300 400 500 _andrew 311 411 511 _reusee 322 433 544 _benny 500 500 600 _andrew 我需要从_benny到_andrew取出字符串,然后在它们之间插入一个带_yahoi的字符串,这样输出就变为 222 333 444 _benny 250 321 422 _yahoii 300 400 500 _andrew 我试过用一个“/\u benny/,/\u

我有许多多行文本文件,格式为

222 333 444 _benny
300 400 500 _andrew
311 411 511 _reusee
322 433 544 _benny
500 500 600 _andrew
我需要从_benny到_andrew取出字符串,然后在它们之间插入一个带_yahoi的字符串,这样输出就变为

222 333 444 _benny
250 321 422 _yahoii
300 400 500 _andrew
我试过用一个“/\u benny/,/\u andrew/”文件名

但它只显示此awk脚本的文本

awk '/_benny/,/_andrew/ { if ( $0 ~ /_benny/ ) { print $0; print "250 321 422 _yahoii"; next } { print } }' filename
将产生预期的结果

222 333 444 _benny
250 321 422 _yahoii
300 400 500 _andrew
322 433 544 _benny
250 321 422 _yahoii
500 500 600 _andrew
避免/start/,/end/根据@ed morton的评论,您也可以尝试以下方法:

awk '{ if ( $0 ~ /_benny/ || $0 ~ /_andrew/ ) { if ( $0 ~ /_benny/ ) { print $0; print "250 321 422 _yahoii"; next } { print } } }' filename

第一个字段是什么?只有一次或每个_benny/_andrew?对于每个条目300 400 500 _andrew是文件中的第二行。其他人怎么了。为什么不是从第一行开始到第500 500 600行?Andrewearch也将被更新。您需要澄清应该使用什么逻辑生成输出?永远不要使用/start/,/end/,因为它会使琐碎的事情稍微简单一些,但即使是稍微不琐碎的事情也需要完全重写和/或复制您已有的条件。始终使用/start/{f=1}f/改为end/{f=0}或类似。谢谢。我不是awk专家,所以如果你想用我的脚本的更正版本来说明你的建议,那就是awsome.awk'/_benny/{f=1;$0=$0 ORS 250 321 422_yahoii}f/_andrew/{f=0}'文件