在我的具体情况下,我需要遍历数百个包含存储URL的变量的文件.所有的URL都不同,但为了这个例子,我们可以假设它们都以"com"结尾
我需要在com之后立即添加一些文本
因为所有的URL都有不同的域名,所以我不能使用sed命令,如:
sed -i 's/^ENVIRONMENT="someurl.com"/ENVIRONMENT="someurl.com.origin.net"/g'
因为文件包含其他可能包含com的行,所以我不能使用类似的东西:
sed -i 's/com/com.origin.net/g'
我需要执行此搜索并仅替换包含模式的特定行,例如下面的正则表达式中的示例:
^ENVIRONMENT.*
如果我可以将sed的使用仅集中在与上述模式匹配的行上,那么我可以使用sed -i等sed的一些改编's/com/com.origin.net/g'
.我当然可以编写一个过于复杂的bash脚本来执行此操作,但我知道有一个很好的一种方法可以告诉sed找到一个模式,只在找到模式的行上工作,然后搜索并替换另一个模式用一个新的字符串.
在搜索Google时,我发现的唯一半相关链接是:https:
//unix.stackexchange.com/questions/37518/how-to-sed-only-that-lines-that-contains-given-string
但它没有充分回答我的问题.也能够将sed一般限制在一个匹配模式的线上,这将是一个很好的工具,可以添加到我的sed arsenal.
任何导致解决方案的帮助将非常感激.
这是一个文件的例子
### Example File
#
#
# someurl.com
ENVIRONMENT="someurl.com"
我想用'ENVIRONMENT ="someurl.com.orign.net"'替换'ENVIRONMENT ="someurl.com"'
我可能会在一个行shell脚本中插入从这篇文章派生的sed命令,例如:
`for f in*.config; do File2BeEdited = $(cat $ f | grep ^ PatternToIdentifyLine | grep -v RemoveLinesThatAreAlreadyCorrect); if ["$ File2BeEdited"!=""];然后RunSedCommand; printf"\n发现需要编辑的文件.\n运行$ f >> log.log"; DONE
因此,我可以遍历目录中的每个配置文件,并有选择地进行此更改
nos*_*sid 10
以下命令行显示了两种可能的解决方案:您可以将替换限制为某些行/regex/
.你可以在更换使用匹配的文本\0
,\1
等等.
sed -e '/^\(ENVIRONMENT="[^"]*\.com\)"/s//\1.origin.net"/'
Run Code Online (Sandbox Code Playgroud)