在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")
答案 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"