簡體   English   中英

如何使用十六進制表示格式化特殊字符(控制字符)

[英]How do I grep for special character(control characters) using hex representation

因此,在幫助某人調試某些代碼的同時,我意識到輸出中有一些奇怪的字符,即 和 (十六進制的\\ xc0和\\ xd0)。

我想在大文本輸出文件中找到這些字符。

我已經設法使用sublime找到這些字符,方法是在查找中使用\\xc0\\xd0啟用find中的regex選項。 我還設法通過在bash中執行grep $'\\xc0' filenamegrep它們。

現在困擾我的是,如果我對grep使用-P選項,它就會拒絕找到這些字符。

grep -P "\\xc0" filename不打印任何包含該字符的文件(上面的其他兩種方法都會成功找到它),這讓我很煩,我想知道為什么這不會工作。

我已經閱讀了其他一些帖子,其中提出了-P選項以及"[\\x80-\\xff]" ,但由於某些原因我無法讓它們工作:\\

grep -P很長一段時間以來一直是好朋友:(任何幫助和提示都很感激!

我正在使用GNU grep。

編輯:

我實際上嘗試了2個Linux發行版。

  • 在Ubuntu 14.04上使用bash:我的終端似乎不喜歡這個角色:\\

printf "\\xc0"在終端中沒有輸出任何內容,但是將其打印到帶有>的文件然后以sublime打開將顯示該字符。

printf "\xc0" > foo
grep $'\xc0' foo > out1
grep -P '\xc0' foo > out2
grep -P '\x{c0}' foo > out3

out{1,2,3}都是空的。

  • 在帶有bash的CentOS 7.2上: printf打印出一些東西 - 問號黑暗的東西

printf "\\xc0"打印出來 (實際上看起來像這樣)

printf "\xc0" > foo
grep $'\xc0' foo > out1
grep -P '\xc0' foo > out2
grep -P '\x{c0}' foo > out3

只有out1包含該字符。

字節

首先需要做的是在變量內部創建要搜索的確切字節

像這樣的東西:

a=$(echo -e '\xc0)
a=$'\xc0'
a=$(printf '\xc0')
a=$(echo -e '\300')     # 300 is 0xC0 in octal
a=$'\300'
a=$(printf '\300')
a=$(echo "c0" | xxd -r -p)

我可以試着想出其他一些方法,但我希望你能得到這個想法。

然后,您可以嘗試使用grep搜索該byte

echo $'Testing this: \xC0 byte' |  grep "$a"

並且,如果您使用具有utf-8(最常見)的語言環境將失敗。 如果您更改為ISO-8859-1區域設置,則可以使用:

LC_ALL=en_US.iso88591 echo $'Testing this: \xC0 byte' |
LC_ALL=en_US.iso88591  grep -P "$a"

或者,如果您不介意啟動新的bash實例:

$ bash
$ export LC_ALL=en_US.iso88591
$ echo $'Testing this: \xC0 byte' |  grep -P "$a"

然后通過執行exit返回舊的bash環境。
這可能有效或無效,具體取決於您的系統。

讓我們探索另一面:角色。

字符

你應該理解一個非常重要的轉折點。
字節不是字符。 好吧,有時,純粹的運氣,它是。

但是除了128個ASCII字符,其中一個字節是一個字符(不是UTF-16或UTF-32。而且我們也忘記了EBCDIC ),所有1,114,112(17×65,536)UNICODE代碼點都有一個以上的字節1

在這種情況下,您應該要求UNICODE代碼點為十六進制0xC0
在現代bash中,像這樣:

$ printf '\U00C0`
À

這個角色是什么:拉丁語大寫字母A與GRAVE

如果語言環境是ISO-8859-1(至少是ISO-8859-15),則將編碼為一個字節;如果語言環境為utf-8,則將其編碼為兩個字節。

$ a=$(printf '\UC0')
$ printf 'Testing \U00C0 character' | grep -P "$a"
Testing À character

如果更改LC_ALL變量,它也會起作用。 好吧,我的意思是grep將檢測到該字符,但由於更改的語言環境,打印的行可能無法正確呈現該字符。

如果文件具有此字符且文件的編碼正確。 Grep將使用變量中字符的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM