我用一個很簡單的sed腳本刪除註釋:sed -e 's/--.*$//'
是的。真的匹配任何角色?
,直到非ASCII字符出現在評論它的偉大工程,例如:-- °
。 該行與正則表達式不匹配,未被替換。
任何想法如何讓.
真正匹配任何字符?
解決方案:
由於file
說,這是一個ISO8859的文本,LANG
環境變量必須在調用sed
之前可以更改: LANG=iso8859 sed -e 's/--.*//' -
我用一個很簡單的sed腳本刪除註釋:sed -e 's/--.*$//'
是的。真的匹配任何角色?
,直到非ASCII字符出現在評論它的偉大工程,例如:-- °
。 該行與正則表達式不匹配,未被替換。
任何想法如何讓.
真正匹配任何字符?
解決方案:
由於file
說,這是一個ISO8859的文本,LANG
環境變量必須在調用sed
之前可以更改: LANG=iso8859 sed -e 's/--.*//' -
@胡格拉:我遇到了類似的情況,試圖刪除線,如如下因素(注意Æ
字符) :
--MP_/yZa.b._zhqt9OhfqzaÆC
在一個文件中,使用
sed 's/^--MP_.*$//g' my_file
由Linux file
命令指示的文件編碼爲
file my_file: ISO-8859 text, with very long lines
file -b my_file: ISO-8859 text, with very long lines
file -bi my_file: text/plain; charset=iso-8859-1
我想你的解決方案,具有不同的排列(聰明!);例如,
LANG=ISO-8859 sed 's/^--MP_.*$//g' my_file
但這些都不奏效。我發現了兩種解決方法:
Perl
表達式工作,即刪除的行:perl -pe 's/^--MP_.*$//g' my_file
[對於-pe
命令行開關的解釋,請參見本StackOverflow的答案:
Perl flags -pe, -pi, -p, -w, -d, -i, -t?]
Æ
字符保留,但現在是UTF8編碼):iconv -f iso-8859-1 -t utf8 my_file > my_file.utf8
由於我用各種編碼的電子郵件很多(1000年),經歷中間處理(bash中,腳本轉換爲UTF-8並不總是工作),我的目的「的解決方案在1個工作「上面可能會是最強大的解決方案。
注:
的文檔GNU sed的z
命令提到了這個效果(我強調):
該命令清空模式空間的內容。通常是 與's /.*//'相同,但效率更高,並且在輸入流中存在無效多字節序列。 POSIX 要求這樣的序列是而不是匹配'。',因此 沒有可移植的方式來清除大多數多字節語言環境(包括UTF-8語言環境)中腳本的 中間的sed緩衝區。
您似乎可能正在以UTF-8(或其他多字節)語言環境運行sed。您需要設置LC_CTYPE
(這比LANG
更細緻,並且不會影響錯誤消息的轉換。有效區域設置名稱通常看起來像en.iso88591
或(對於您的配置文件中的位置)fr_FR.iso88591
,而不僅僅是編碼本身 - 你也許能看到locale -a
完整列表
例子:
LC_CTYPE=fr_FR.iso88591 sed -e 's/--.*//'
或者,如果您知道該行的非註釋部分僅包含ASCII,你可能分裂。在評論標記上打印第一部分並丟棄其餘部分:
sed -e 's/--/\n/' -e 'P' -e 'd'