怎么做搜索&在mingw中用字符串中的引号替换?

时间:2017-02-25 19:07:10

标签: bash powershell sed mingw

在mingw中使用sed但它破坏了安全设置,PowerShell可以工作,例如:

powershell -Command "(gc configure) -replace 'uname -msr', 'uname -ms' | Out-File -encoding ASCII configure"

但是,当我需要在查找/替换字符串中使用引号时,这不起作用。如何在powershell命令中删除引号和/或查找&一般替换而不破坏文件?

我已经尝试了`",但随后报价匆匆上升。我已经尝试了`\",但这也无效。

我的问题不是Using the replace operator on a string that has quotes powershell的重复,因为我在这里处理powershell和bash。

以下是我尝试过但没有成功的例子:

$ powershell -Command \"(Get-Content CMakeLists.txt).Replace(\"SET(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} /W4\")\", \"SET(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS}\\")") | Out-File -encoding ASCII configure\"
sh: syntax error near unexpected token `('

$ powershell -Command "(Get-Content CMakeLists.txt).Replace("SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")", "SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")") | Out-File -encoding ASCII configure"
sh: syntax error near unexpected token `('

# this one goes through...
$ powershell -Command "(Get-Content CMakeLists.txt).Replace('SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")', 'SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")') | Out-File -encoding ASCII configure"

# But doesn't actually apply the change
$ cat CMakeLists.txt | grep CMAKE_C_FLAGS
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")

Here is the file我想替换,这些都是我想要做的替代:

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4") to SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
SET(linkFlags "/PDB:NONE /INCREMENTAL:NO /OPT:NOREF /OPT:NOICF") to SET(linkFlags)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4996 /wd4255 /wd4130 /wd4100 /wd4711") to SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
SET(CMAKE_C_FLAGS_DEBUG "/D DEBUG /Od /Z7") to SET(CMAKE_C_FLAGS_DEBUG "-g")
SET(CMAKE_C_FLAGS_RELEASE "/D NDEBUG /O2") to SET(CMAKE_C_FLAGS_RELEASE "-O2")

4 个答案:

答案 0 :(得分:1)

您可以使用正则表达式-replace函数避免使用双引号进行替换。这应该这样做:

powershell -Command "(Get-Content CMakeLists.txt -Raw) -replace '\/W4' -replace '(?<=SET\(linkFlags)[^\)]+' -replace '\/wd4996 \/wd4255 \/wd4130 \/wd4100 \/wd4711' -replace '(?<=SET\(CMAKE_C_FLAGS_DEBUG .)\/D \DEBUG \/Od \/Z7', '-g' -replace '(?<=SET\(CMAKE_C_FLAGS_RELEASE .)\/D NDEBUG \/O2', '-O2' | Out-File -encoding ASCII configure"

您还可以使用-EncodedCommand powershell.exe参数传递命令的 base-64编码字符串版本。这里是一个如何使用PowerShell获取base-64编码字符串的示例:

$cmd = 
@'
(Get-Content CMakeLists.txt).Replace('SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")', 'SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")') | Out-File -encoding ASCII configure
'@

$encodedCmd = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($cmd))

现在,您可以使用$encodedCmd的内容调用编码命令,如下所示:

powershell -EncodedCommand 'KABHAGUAdAAtAEMAbwBuAHQAZQBuAHQAIABDAE0AYQBrAGUATABpAHMAdABzAC4AdAB4AHQAKQAuAFIAZQBwAGwAYQBjAGUAKAAnAFMARQBUACgAQwBNAEEASwBFAF8AQwBfAEYATABBAEcAUwAgACIAJAB7AEMATQBBAEsARQBfAEMAXwBGAEwAQQBHAFMAfQAgAC8AVwA0ACIAKQAnACwAIAAnAFMARQBUACgAQwBNAEEASwBFAF8AQwBfAEYATABBAEcAUwAgACIAJAB7AEMATQBBAEsARQBfAEMAXwBGAEwAQQBHAFMAfQAiACkAJwApACAAfAAgAE8AdQB0AC0ARgBpAGwAZQAgAC0AZQBuAGMAbwBkAGkAbgBnACAAQQBTAEMASQBJACAAYwBvAG4AZgBpAGcAdQByAGUA' -NoProfile

答案 1 :(得分:0)

在PowerShell中,您可以使用反引号转义字符&#34; `&#34;。例如:

$x ="test`""
test"

或者,您可以使用单引号声明一个字符串,并在其中使用双引号。例如:

$x =  ' "te"st"'
"te"st"

查看此link以获取更多详细信息。

希望有所帮助。

答案 2 :(得分:0)

尝试使用像这样的双引号

powershell -Command "(gc configure).Replace("L'Oréal", "L'Oréal2") | Out-File -encoding ASCII configure"

答案 3 :(得分:0)

你需要单引号来包装你的字符串,并\来逃避bash的双引号。 这应该工作

powershell -Command "(Get-Content CMakeLists.txt).Replace('SET(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} /W4\")', 'SET(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS}\")') | Out-File -encoding ASCII configure"