在我的特定情况下,我需要遍历数百个包含存储URL的变量的文件。所有的URL都不同,但为了这个例子,我们可以假设它们都以“com”'
结尾我需要在com
之后立即添加一些文字因为所有网址都有不同的域名,所以我不能使用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 's/com/com.origin.net/g'
等sed的一些改编。我当然可以编写一个过于复杂的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”'替换为'ENVIRONMENT =“someurl.com.orign.net”'
我可能会在一个行shell脚本中插入从这篇文章派生的sed命令,例如:
`for f in * .config; do File2BeEdited = $(cat $ f | grep ^ PatternToIdentifyLine | grep -v RemoveLinesThatAreAlreadyCorrect); if [“$ File2BeEdited”!=“”];然后RunSedCommand; printf“\ n发现需要编辑的文件。\ n运行$ f>> log.log”;完成
因此,我可以遍历目录中的每个配置文件并有选择地进行此更改
答案 0 :(得分:10)
以下命令行显示了两种可能的解决方案:您可以使用/regex/
将替换限制为某些行。您可以在\0
,\1
等替换中使用匹配的文字。
sed -e '/^\(ENVIRONMENT="[^"]*\.com\)"/s//\1.origin.net"/'
答案 1 :(得分:-3)
你可以用gvim来实现..
:g / ^ baz / s / foo / bar / g
解释:在以baz开头的所有行中,用bar替换所有出现的foo。
检查 http://vim.wikia.com/wiki/Search_and_replace 了解更多详情......