Linux 从shell/bash输出的时髦文件名?

Linux 从shell/bash输出的时髦文件名?,linux,bash,shell,Linux,Bash,Shell,所以,我制作了一个小脚本来完成整个任务。任务是将dmidecode-Fn的输出获取到文本文件中,然后获取dmidecode输出的一部分,在我的示例中,地址(0xE0000)作为txt的文件名 我的脚本如下所示,确实有效,我已经测试过了。我唯一的一个小问题是,txt的文件名显示为“?0xE0000.txt” 我的问题是,为什么我的名字后面会有一个问号和一个空格 #!/bin/bash directory=$(pwd) name=$(dmidecode|grep -i Address|sed 's/

所以,我制作了一个小脚本来完成整个任务。任务是将
dmidecode-Fn
的输出获取到文本文件中,然后获取
dmidecode
输出的一部分,在我的示例中,地址(0xE0000)作为txt的文件名

我的脚本如下所示,确实有效,我已经测试过了。我唯一的一个小问题是,txt的文件名显示为“?0xE0000.txt”

我的问题是,为什么我的名字后面会有一个问号和一个空格

#!/bin/bash
directory=$(pwd)
name=$(dmidecode|grep -i Address|sed 's/Address://')
inxi -Fn > $directory/"$name".txt
“$name.txt”中的引号是为了避免在运行脚本时出现“不明确重定向”错误

更新@Just someone

root@server:/home/user/Desktop# dmidecode | sed -n 's/Address://p'
         0xE0000
root@server:/home/user/Desktop#
解决方案 使用
|sed-n的/^.*地址:.*0x/0x/p'
去掉了0xE0000.txt中的“?”


非常感谢大家

里面有一个非打印字符。尝试:

dmidecode |grep -i Address|sed 's/Address://'| od -c
看看你到底得到了什么

更新:注释表明其中有一个选项卡字符需要清除

更新2:前导选项卡位于单词
地址之前。尝试:

name=$(dmidecode |grep -i Address|sed 's/^.*Address:.*0x/0x/')
或者正如有人指出的那样:

name=$(dmidecode|sed -n 's/^.*Address:.*0x/0x/p')
更新3

这将替换正则表达式更改为replace

^(行首)后跟.*(任何字符(包括制表符!)后跟地址:后跟.*(任何字符(包括空格!))后跟0x(由于地址是十六进制的,所以始终位于地址的开头)

0x(因为您希望将其作为结果的一部分)


如果您想了解更多信息,请阅读sed正则表达式和替换。

什么是
echo“$name”| xxd
输出?听起来好像
dmicode
地址:
和地址之间放置了一些内容。也许是制表符?如果我必须在黑暗中尝试,我会遇到
grep
插入颜色转义序列并破坏东西的情况。请确保您没有使用
grep
别名,或者明确使用
grep--color=never
我的脚本如下所示并且确实有效,我已经对它进行了测试。-鉴于
dmicode
打字错误,这是一个大胆的说法。
grep | sed
总是可疑的,很少有理由,sed通常就足够了。在您的情况下,
dmidecode | sed-n'/Address://p'
直接在终端中键入此内容,会给我:
sed:-e表达式#1,char 13:未知选项
s'0000000`抱歉,在其中键入了一个额外的/。已编辑。这样想,我现在得到的是0000000\t0 x e0\n0000012@pjz删除grep部分:
dmidecode | sed-n's/Address://p'
好吧,这个空间已经被去掉了,现在我只在名字前面加了一个“?”。所以它是“
?0xE0000.txt
”。我决定用awk代替grep,我不认为这有什么区别,因为他们实际上做的是同一件事。