在grep结果上调用sed-linux shell脚本/文本处理

在grep结果上调用sed-linux shell脚本/文本处理,linux,bash,shell,Linux,Bash,Shell,调用sed on grep结果并将其保存到文件的最佳方法是什么? 我想更改文本文件中的一些行,例如 嗨{汤姆·玛丽·安迪} 什么{Eric John Ted} 你好{杰瑞·凯蒂·马克} 所以我的问题是,我想在所有包含在括号{}之间的名字前面加上字母T,这些名字是Hi行,覆盖文件。结果应该是这样的: 嗨{T.汤姆T.玛丽T.安迪} 什么{Eric John Ted} 你好{T.杰瑞T.凯蒂T.马克} 您认为最好的解决方案/命令是什么?我将编写shell脚本来实现这一点。我知道我可以grep这些行,

调用sed on grep结果并将其保存到文件的最佳方法是什么? 我想更改文本文件中的一些行,例如

嗨{汤姆·玛丽·安迪}

什么{Eric John Ted}

你好{杰瑞·凯蒂·马克}

所以我的问题是,我想在所有包含在括号{}之间的名字前面加上字母T,这些名字是Hi行,覆盖文件。结果应该是这样的:

嗨{T.汤姆T.玛丽T.安迪}

什么{Eric John Ted}

你好{T.杰瑞T.凯蒂T.马克}

您认为最好的解决方案/命令是什么?我将编写shell脚本来实现这一点。我知道我可以grep这些行,稍后将其更改为array和concat,但我认为这不是一个好的解决方案:谢谢您的帮助。

如果您有:

Hi { Tom Mary Andy }
What { Eric John Ted }
Hi { Jerry Katy Mark }
并希望在以“Hi”开头的行中的每个大写字母前插入“T”,以获得:

Hi { T.Tom T.Mary T.Andy }
What { Eric John Ted }
Hi { T.Jerry T.Katy T.Mark }
然后你可以单独和塞德一起做。要就地编辑文件,请使用sed的“-i”选项:

注意:要创建原始文件的备份,请使用sed-i.bak

如果您使用的mac或其他操作系统提供的sed没有“-i”选项,那么您可以使用:

sed '/^Hi/s/\s\([A-Z]\)/ T.\1/g' < filename.txt > newfilename.txt

一般来说,使用newfilename.txt中的结果,没有必要这样做:sed可以完成grep本身可以完成的所有工作,而awk仍然比这两种方式更灵活。如果你展示了你的grep行,我们可以向你展示如何将它折叠到sed中,或者如何在awk中本地实现这两个行所需的逻辑……如果你不介意一些额外的细节,那么整个过程可以在bash中本地完成,而无需外部工具-也无sed、grep或awk。现在我正在计算出现的次数,在该范围内创建for循环。每次迭代我都会保存返回当前外观的grep结果,删除括号和Hi命令,将字符串变量更改为array,并使for循环在每个单词的开头添加一个T字母。最后,我用我新修改的Hi-line解释了Hi-line的出现。-我不是POSIX指定的,在GNU和Apple实现之间使用不兼容,如果没有明确的警告,建议是不理想的。感谢您的快速帮助:我还有一个问题,我怎样才能达到同样的效果,但是当启动命令将是例如>Hi Everyone{Tom Mark Katy}时,因为使用您的公式,T也被插入到每个人的Beginng处,必须使其sed-i'/^Hi[{]/s/\s\[A-Z]\/T.\1/g'filename.txt您基本上是在执行sed/find/s/substitute/with/操作,因此您可以根据需要限制或扩展每个部分。注意:\1是一个反向引用,它重复替换部分中\stuff\之间的内容。
sed '/^Hi/s/\s\([A-Z]\)/ T.\1/g' < filename.txt > newfilename.txt