【问题标题】:ORD and CHR a file in BashORD 和 CHR 在 Bash 中的文件
【发布时间】:2015-02-12 11:44:12
【问题描述】:

我构建了 ordchr 函数,它们工作得很好。 但是如果我取一个包含\n的文件,例如:

hello
CHECK THIS HIT
YES

当我ord 一切我没有得到任何新的行值。这是为什么?我正在用 Bash 写作。

这是我正在使用的代码:

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

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

【问题讨论】:

  • 展示您的 ordchr 函数,以及如何将它们与文件一起使用!
  • 那是因为你在做echo $STR,而不是echo "$STR"
  • @gniourf_gniourf 是的,我明白这一点。我删除了我的评论以避免对 OP 造成混淆,但我只是在说明,没有引号,就有问题。
  • @JhonaBona99 这很可能是因为您的ord 命令写得不好,而且到处都漏掉了很多引号! 请出示您的代码
  • 您的问题是在 41 分钟前发布的。 38 分钟前,我要求您出示您的代码。我们浪费了这么多时间,因为你不想合作!您的问题有 4 票赞成,3 票反对。难道你不明白我们要求你帮助你的唯一一件事就是你展示你的代码???编辑您的帖子并包含您的 ord 函数以及您使用它的方式。

标签: bash chr ord


【解决方案1】:

你的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

这仍然存在两个问题:您将不能有空字节,并且您不会看到尾随的换行符。例如(我将您的脚本称为bananachmod +x banana):

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

这里显示了两个问题:在TEXT=$(cat "$1") 部分从 Bash 中删除了空字节,因为 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"

就这么简单!

【讨论】:

  • 非常感谢,你真的很有帮助!
猜你喜欢
  • 2022-12-04
  • 1970-01-01
  • 2013-12-13
  • 2012-08-30
  • 1970-01-01
  • 2012-04-13
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多