我有一个java属性文件,如下所示:
SiteUrlEndpoint=google.com/mySite
我想使用sed -i来内联替换url但保留其中出现的上下文路径。因此,例如,如果我想更改上面的属性文件以使用amazon.com,那么结果将如下所示:
SiteUrlEndpoint=amazon.com/mySite
我遇到sed只有在替换内联时才更换url并保留上下文路径的问题。
我的尝试:
sed -i 's:^[ \t]*siteUrlEndpoint[ \t]*=\([ \t]*.*\)[/]*$:siteUrlEndpoint = 'amazon.com':' file
答案 0 :(得分:3)
您可以使用两个反向引用来完成此操作,例如
sed -i.bak 's|^\(SiteUrlEndpoint=\).*/\(.*\)|\1amazon.com/\2|' file
注意:/
之前的文字匹配贪婪。如果域后面有多个路径部分,则可能需要保留所有路径组件。要使其非贪婪,您可以使用以下代码
sed -i.bak 's|^\(SiteUrlEndpoint=\)[^/]*/\(.*\)|\1amazon.com/\2|' file
(您可以添加i.bak
以在file.bak
中创建原始文件的备份
要完成同样的事情,您可以先在行的开头匹配SiteUrlEndpoint=
,然后使用单个反向引用进行更改,例如
sed -i.bak '/^SiteUrlEndpoint=/s|=[^/]*\(/.*\)|=amazon.com\1|' file
例如,给定一个包含以下内容的文件sites
$ cat sites
SiteUrlEndpoint=google.com/path/to/mySite
SiteUrlSomeOther=google.com/mySite
您可以使用(使用非贪婪形式的第一个示例)将google.com
更改为amazon.com
:
$ sed -i 's|^\(SiteUrlEndpoint=\)[^/]*/\(.*\)|\1amazon.com/\2|' sites
确认:
$ cat sites
SiteUrlEndpoint=amazon.com/path/to/mySite
SiteUrlSomeOther=google.com/mySite
和
$ cat sites.bak
SiteUrlEndpoint=google.com/path/to/mySite
SiteUrlSomeOther=google.com/mySite
解释 (第一种形式)
sed -i.bak 's|^\(SiteUrlEndpoint=\)
- 定位&保存
SiteUrlEndpoint=
[^/]*/
- 匹配任何以下字符,直到第一个/
(非贪婪 -
根据需要调整)\(.*\)
- 匹配并保存/
|\1amazon.com/\2|'
- 完全替换(以下说明)\1
- 包含SiteUrlEndpoint=
amazon.com
- 不言自明/\2
- 后续所有内容的'/'
秒反向引用。查看所有解决方案,如果您有任何疑问,请与我们联系。
答案 1 :(得分:0)
正则表达式很难,特别是对于复杂的正则表达式和/或要避免意外更改的大型输入文件。
因此,我强烈建议您使用sed -i.bak
备份原始文件,然后在这两个文件上运行diff
以查看更改内容。
假设
siteUrlEndpoint
(不区分大小写)amazon.com
我提出了这个解决方案:
sed -i.bak 's;^\([ \t]*siteurlendpoint[ \t]*=[ \t]*\)[^/]*\(.*\);\1amazon.com\2;Ig' infile
我使用分号代替你的冒号,当我不想使用/
时,这只是我的偏好;)
然后我将前导空格和siteurlendpoint
以及从第一个/
开始到括号\( \)
的所有内容都包裹起来,以便我可以在替换\1
时再次使用它们1}}和\2
。这样我就可以保持缩进和SiteUrlEndpoint
的大小写完整。
对于搜索选项,我向I
添加了g
以使搜索不区分大小写。我不确定此选项的标准程度,您可能需要了解sed
是否了解它。
我要替换的实际部分我只有任何字符,不包括下一个/
:[^/]*
关于你的专栏:
siteUrlEndpoint
。因为在您的示例中,您使用大写S编写它,它不会触发。[/]*$
根本没有任何意义。 “这一行可以以零或多个字符结尾:/
。”[/]*$
之前加.*
,这意味着:任何字符都为零或更多。'amazon.com'
周围的单引号可能会干扰整个搜索/替换字词周围的单引号。它似乎有效,但它很草率,如果那里有任何空间,它将会失败。它似乎没有任何用途(除非你想用amazon.com
之类的环境变量替换$NEWSITE
,所以我不知道你为什么这样做。 答案 2 :(得分:0)
对域之前的部分进行反向引用 - 然后匹配并替换域 - 您可以在验证sed命令的输出后添加-i选项
library(httr)
library(rvest)
library(dplyr)
res <- POST(url = "http://karpo.gov.bc.ca/royp-bin/phcgi.exe",
add_headers(Origin = "http://karpo.gov.bc.ca",
`Accept-Encoding` = "gzip, deflate",
`Accept-Language` = "en-US,en;q=0.8",
`User-Agent` = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.70 Safari/537.36",
Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
Referer = "http://karpo.gov.bc.ca/royp-bin/phcgi.exe?PH_QKC=WRMSQFELD&PH_APP=RMSprodApp&PH_HTML=WRMSQ_FACI_PLANT.HTM"),
body=list(PH_HTML = "WRMSQ_FACI_PLANT.HTM",
PH_QKC = "WRMSQ_FACI_PLANT",
PH_APP = "RMSPRODAPP",
PH_SEARCH = "PH_SEARCH_STARTPH_SEARCH_END",
PH_RECORDID = "PH_RECORDID_STARTPH_RECORDID_END",
`WEB_FACI_PLANT_VIEW:FACILITY` = "",
`WEB_FACI_PLANT_VIEW:PLANT` = "160",
PH_ACTION = "Search"),
encode="form")
pg <- content(res, as="parsed")
glimpse(html_table(pg)[[2]])
## Observations: 11
## Variables: 6
## $ FacilityCode <int> 160, 161, 1647, 2355, 4557, 4582, 5857, 7200, 8294, 9049...
## $ FacilityName <chr> "aitken gas aitkencreek d-044-l/094-a-13 002", "aitken g...
## $ LinkEffective <chr> "1993 06", "1993 06", "2001 04", "2001 03", "2001 03", "...
## $ LinkTerminated <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
## $ PlantCode <int> 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160
## $ PlantName <chr> "aitken gas aitkencreek d-044-l/094-a-13 002", "aitken g...
答案 3 :(得分:0)
保持简单:
$ sed -E 's/(SiteUrlEndpoint=)[^.]+/\1amazon/' file
SiteUrlEndpoint=amazon.com/mySite