使用sed替换java属性文件中的文本

时间:2016-08-26 00:46:14

标签: bash shell sed

我有一个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

4 个答案:

答案 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

解释 (第一种形式)

  1. sed -i.bak 's|^\(SiteUrlEndpoint=\) - 定位&保存 SiteUrlEndpoint=
  2. [^/]*/ - 匹配任何以下字符,直到第一个/(非贪婪 - 根据需要调整)
  3. \(.*\) - 匹配并保存/
  4. 之后的所有内容
  5. |\1amazon.com/\2|' - 完全替换(以下说明)
  6. \1 - 包含SiteUrlEndpoint=
  7. 的第一个反向引用
  8. amazon.com - 不言自明
  9. /\2 - 后续所有内容的'/'秒反向引用。
  10. 查看所有解决方案,如果您有任何疑问,请与我们联系。

答案 1 :(得分:0)

正则表达式很难,特别是对于复杂的正则表达式和/或要避免意外更改的大型输入文件。

因此,我强烈建议您使用sed -i.bak备份原始文件,然后在这两个文件上运行diff以查看更改内容。

假设

  1. 您只想在标记siteUrlEndpoint(不区分大小写)
  2. 之后更改内容
  3. 您希望在保持路径完整的情况下将网址更改为amazon.com
  4. 我提出了这个解决方案:

    sed -i.bak 's;^\([ \t]*siteurlendpoint[ \t]*=[ \t]*\)[^/]*\(.*\);\1amazon.com\2;Ig' infile
    

    我使用分号代替你的冒号,当我不想使用/时,这只是我的偏好;)

    然后我将前导空格和siteurlendpoint以及从第一个/开始到括号\( \)的所有内容都包裹起来,以便我可以在替换\1时再次使用它们1}}和\2。这样我就可以保持缩进和SiteUrlEndpoint的大小写完整。

    对于搜索选项,我向I添加了g以使搜索不区分大小写。我不确定此选项的标准程度,您可能需要了解sed是否了解它。

    我要替换的实际部分我只有任何字符,不包括下一个/[^/]*

    关于你的专栏:

    1. 您的搜索字词仅搜索小写字母siteUrlEndpoint。因为在您的示例中,您使用大写S编写它,它不会触发。
    2. 最后[/]*$根本没有任何意义。 “这一行可以以零或多个字符结尾:/。”
    3. 您在此[/]*$之前加.*,这意味着:任何字符都为零或更多。
    4. '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