बैश पर फ़ाइल के सभी अक्षरों के लिए यूनिकोड कोड पॉइंट देखें


11

मुझे एक ऐसी फ़ाइल से निपटना है जिसमें बहुत सारे अदृश्य नियंत्रण वर्ण हैं, जैसे "दाएं से बाएं" या "शून्य चौड़ाई गैर-योजक", सामान्य स्थान की तुलना में अलग-अलग स्थान और इसी तरह, और मुझे इससे निपटने में परेशानी होती है।

अब, मैं किसी भी तरह से दिए गए फ़ाइल में सभी पत्रों को देखना चाहता हूं, पत्र द्वारा पत्र (मैं "बाएं से दाएं" कहना चाहूंगा, लेकिन मैं दुर्भाग्य से दाएं-बाएं भाषा से निपट रहा हूं) , यूनिकोड कोडपॉइंट्स के रूप में, केवल उपयोग करके बुनियादी बैश उपकरण (जैसे vi, less, cat...)। क्या यह किसी तरह संभव है?

मुझे पता है कि मैं फ़ाइल को हेक्साडेसिमल में प्रदर्शित कर सकता हूं hexdump, लेकिन मुझे कोडपॉइंट को फिर से लिखना होगा। मैं वास्तव में वास्तविक यूनिकोड कोडपॉइंट्स देखना चाहता हूं, इसलिए मैं उन्हें गूगल कर सकता हूं और पता लगा सकता हूं कि क्या हो रहा है।

संपादित करें: मैं यह जोड़ूंगा कि मैं इसे अलग-अलग एन्कोडिंग में ट्रांसकोड नहीं करना चाहता हूं (क्योंकि यही मैं ऑनलाइन पता लगा रहा हूं)। मेरे पास UTF8 में फाइल है और यह ठीक है। मैं सिर्फ सभी अक्षरों का सटीक कोडपॉइंट जानना चाहता हूं।

जवाबों:


6

मैंने खुद को एक पर्ल-लाइनर लिखा है, जो बस यही करता है, और यह मूल चरित्र को भी छापता है। (यह STDIN से फ़ाइल की अपेक्षा करता है)

perl -C7 -ne 'for(split(//)){print sprintf("U+%04X", ord)." ".$_."\n"}'

हालांकि, इससे बेहतर तरीका होना चाहिए।


हां, यह काम करता है, और हमें इस कमांड की आवश्यकता है
यान किंग यिन

5

मुझे कुछ सामान्य स्माइली के लिए कोड बिंदु की आवश्यकता थी, और इसके साथ आया:

echo -n "😊" |              # -n ignore trailing newline                     \
iconv -f utf8 -t utf32be |  # UTF-32 big-endian happens to be the code point \
xxd -p |                    # -p just give me the plain hex                  \
sed -r 's/^0+/0x/' |        # remove leading 0's, replace with 0x            \
xargs printf 'U+%04X\n'     # pretty print the code point

जो प्रिंट करता है

U+1F60A

जो "SMILING FACE with SMILING EYES" का कोड बिंदु है ।


3

नेफ्टस के जवाब से प्रेरित होकर , यहां थोड़ा सरल समाधान है जो तार के साथ काम करता है, न कि एक चार से:

iconv -f utf8 -t utf32le | hexdump -v -e '8/4 "0x%04x " "\n"' | sed -re"s/0x /   /g"
#                                         ^
# The number `8` above determines the number of columns in the output. Modify as needed.

मैंने एक बैश स्क्रिप्ट भी बनाई जो स्टड से, या एक फ़ाइल से पढ़ती है, और जो यूनिकोड मानों के साथ मूल पाठ को प्रदर्शित करती है:

COLWIDTH=8
SHOWTEXT=true

tmpfile=$(mktemp)
cp "${1:-/dev/stdin}" "$tmpfile"
left=$(set -o pipefail; iconv -f utf8 -t utf32le "$tmpfile" | hexdump -v -e $COLWIDTH'/4 "0x%05x " "\n"' | sed -re"s/0x /   /g")


if [ $? -gt 0 ]; then
    echo "ERROR: Could not convert input" >&2
elif $SHOWTEXT; then
    right=$(tr [:space:] . < "$tmpfile" | sed -re "s/.{$COLWIDTH}/|&|\n/g" | sed -re "s/^.{1,$((COLWIDTH+1))}\$/|&|/g")
    pr -mts" " <(echo "$left") <(echo "$right")
else
    echo "$left"
fi


rm "$tmpfile"

नमूना उत्पादन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.