2015-02-12 5 views
-3

Я строю ord и chr функциями, и они отлично работают. Но если взять файл, который содержит \n, например:ORD и CHR файл в Bash

hello 
CHECK THIS HIT 
YES 

ord, когда я все, что я не получаю новые значения строки. Почему это? Я пишу в Баше.

Вот код, который я использую:

function ord { 
    ordr="`printf "%d\n" \'$1`" 
} 

TEXT="`cat $1`" 
for ((i=0; i<${#TEXT}; i++)) 
do 
    ord "${TEXT:$i:1}" 
    echo "$ordr" 
done 
+2

Покажите свои функции 'ord' и' chr' и как вы их используете с вашим файлом! –

+0

@lurker Так я считаю, что проблема это в том, как хранить содержимое файла я делаю STR = 'кошки file1' В новых строках значения впитывается, как вы сказали .. Как я могу хранить в контенте вар файл – JhonaBona99

+0

Вы ошибаетесь: 'STR = $ (cat file1)' _doesn't "поглощать" (что бы это ни значило) значения новой строки_. Вероятно, вам не хватает котировок, что, к сожалению, слишком распространенная ошибка. Покажите свой код! –

ответ

2

ord Ваша функция действительно странно. Может быть, было бы лучше, чтобы написать:

function ord { 
    printf -v ordr "%d" "'$1" 
} 

Тогда вы будете использовать его как:

TEXT=$(cat "$1") 
for ((i=0; i<${#TEXT}; i++)); do 
    ord "${TEXT:$i:1}" 
    printf '%s\n' "$ordr" 
done 

Это все еще оставляет две проблемы: вы не будете в состоянии иметь нулевые байты, и вы выиграли Не вижу конца новых строк. Например (я назвал свой сценарий banana и chmod +x banana):

$ ./banana <(printf 'a\0b\n') 
97 
98 

Две проблемы показывают здесь: нулевые байты удаляются из Bash в TEXT=$(cat "$1") частях, так как переменная Bash не может содержать нулевые байты. Более того, этот шаг также обрезает завершающие символы новой строки.

Более надежный подход будет использовать read:

while IFS= read -r -n 1 -d '' char; do 
    ord "$char" 
    printf '%s\n' "$ordr" 
done < "$1" 

С этой модификации:

$ ./banana <(printf 'a\0b\n') 
97 
0 
98 
10 

Обратите внимание, что этот сценарий будет зависеть от вашей местности. С моей местности (LANG="en_US.UTF-8):

$ ./banana <(printf 'a\0ℂ\n') 
97 
0 
8450 
10 

тогда:

$ LANG= ./banana <(printf 'a\0ℂ\n') 
97 
0 
226 
132 
130 
10 

Это, чтобы показать вам, что Bash не читает байт, но символы. Поэтому в зависимости от того, как вы хотите, чтобы Bash обрабатывал ваши данные, установите соответственно LANG.


Если ваш скрипт только делает это, это гораздо проще не использовать ord функцию на все:

#!/bin/bash 

while IFS= read -r -n 1 -d '' char; do 
    printf '%d\n' "'$char" 
done < "$1" 

Это так просто!

+0

Большое спасибо, вы были очень полезны! – JhonaBona99