如何在 mingw 中用字符串中的引号进行搜索和替换?

How to do search & replace in mingw with quotes in the string?

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

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

但是,当我需要在 find/replace 字符串中使用引号时,这不起作用。如何在不损坏文件的情况下转义该 powershell 命令中的引号和/或查找和替换?

我试过 `" 但引述 bash 了。我试过 `\",但也没用。

我的问题不是 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")

在 PowerShell 中,您可以使用反引号“`”转义字符。示例:

$x ="test`""
test"

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

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

查看此 link 了解更多详情。

希望对您有所帮助。

尝试像这样使用双引号

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

您需要单引号来包裹您的字符串,\ 来转义 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"

您可以避免使用双引号,方法是使用正则表达式 -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