如何在 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
在 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