2017-10-08 161 views
1

我正在翻譯一個GNU MakefileMSBuild XML。cmd - sed命令輸入解析錯誤

我有以下sed命令(一個更大的命令的一部分):

... | sed 's/^Q(.*)/"&"/' | ... 

當我執行只是在Cygwinsed部分,它「作品」在這個意義上,它並不會報錯了。

不過,我已經將它轉換爲XML MSBuild後 - 取代了XML敏感的符號與"&' - 我得到的錯誤

sed的:不支持的命令「

我確信這不是XML轉義問題的問題;在Visual Studio生成日誌說

任務參數:命令= 「C:\ Program Files文件\ GNU ARM的Eclipse \構建工具\ 2.8-201611221915 \ BIN \ sed的」「S/^ Q /」(*)。 &「/ '(任務id:21)

sed的:不支持的命令'(任務id:21)

命令 「」 C:\ Program Files文件\ GNU ARM的Eclipse \構建工具\ 2.8-201611221915 \ BIN \ (TaskId:21)

('*)/'Q(*)/「&」/'「該命令被翻譯成最初打算的sed 's/^Q(.*)/"&"/'

但是,現在似乎有一個問題與cmd.exe

關於cmd.exe,該命令的哪部分不是這樣的?
是單/雙引號嗎?和號?

我使用表from here

+0

不知道,因爲它似乎是你正在使用的'sed'版本,它反對它正在接收的命令。如果你確定'cmd'不能協同工作,那麼'cmd'將''''''''''''作爲特殊字符。我試着用'^'轉義每一個,所以''s/^^ Q(。* ^)/「^&」/'' - '^'通常會轉義'cmd'中的有問題的字符 - %' ''''' – Magoo

+0

@Magoo我把''s/^ Q(。*)/「&」/''放在一個文本文件中,並把它叫做'sed -f sedCmd.txt',我得到了同樣的錯誤信息。這縮小了什麼? – Adrian

+0

這似乎與'bash'沒有任何關係 – chepner

回答

2

在Unix/Linux/Mac的支持外殼口譯至少三種類型的參數字符串:

  1. 無報價不包含與命令解釋程序有特殊的意義空格字符或簡單的字符串參數字符串。
  2. "帶引號的字符串中包含空格字符的字符串或帶有特殊含義的字符,不含包含"的shell解釋器。
  3. '帶引號的字符串包含空格字符的字符串或帶有特殊含義的字符,不包含'的shell解釋器。

Windows命令行解釋程序僅支持兩種類型的參數字符串。

  1. 對於不包含空格字符或其中一個字符的簡單字符串,不包含引號字符串:&()[]{}^=;!'+,`~|<>
  2. "帶引號的字符串包含空格字符的字符串或對Windows命令解釋器不具有特殊含義的字符不包含"

爲此正則表達式字符串作爲含有"參數字符串是在Windows問題的,因爲存在用於作爲引用參數字符串* nix中/ Mac的殼沒有替代的解決方案。

正則表達式在Perl語法中的解決方案是在正則表達式中使用十六進制表示法\x22用於雙引號字符"

所以"s/^Q(.*)/\x22&\x22/"可以在Windows和Linux上使用,而不是在's/^Q(.*)/"&"/'上。

但是,命令行參數字符串最終是由被調用的應用程序處理的,它取決於應用程序和使用的編譯器應用程序如何解釋參數。因此,它總是取決於應用程序的最終工作。請參閱C代碼this answer以及運行此代碼時使用三個不同的編譯器編譯錯誤參數字符串的兩種不同結果。爲參數字符串的應用程序相關的解釋再如在回答解釋上How to set environment variables with spaces?

對於使用剛剛s/^Q(.*)/"&"/因此沒有封閉在單引號'作品在Windows上的sed太正則表達式參數字符串。