我对bash脚本行感到困惑

我对bash脚本行感到困惑,bash,Bash,我正在尝试将bash脚本转换为一个实习生项目的python;基本上,脚本解析一个表,并将信息打印为HTML文档 这句话把我弄糊涂了。TMP是一个临时文档,是lsload的输出,它输出一个包含服务器主机信息的表 # Force header text to lowercase tr '[:upper:]' '[:lower:]' <${TMP} |head --lines=+1 |sed -e 's/[ \t]\+/ /g' >${H_TMP} #强制标题文本为小写 tr'[:upp

我正在尝试将bash脚本转换为一个实习生项目的python;基本上,脚本解析一个表,并将信息打印为HTML文档

这句话把我弄糊涂了。TMP是一个临时文档,是
lsload
的输出,它输出一个包含服务器主机信息的表

# Force header text to lowercase
tr '[:upper:]' '[:lower:]' <${TMP} |head --lines=+1 |sed -e 's/[ \t]\+/ /g' >${H_TMP}
#强制标题文本为小写
tr'[:upper:''[:lower:'${H_TMP}
好的,第一个
tr
命令是将标题文本从大写转换为小写。我不确定
head
命令在做什么。我对sed的功能也感到困惑。有人能澄清一下这方面的情况吗

作为奖励,有人对我如何将其转换为Python有什么想法吗


编辑:好吧,我似乎明白了
sed
在做什么;它将任意数量的空格或制表符转换为单个空格。现在对
head
感到困惑。

通过搜索任何Unix命令的手册页,您应该能够轻松找到该命令的文档

对Unix命令行的任何基本介绍还将揭示
head
读取文本文件的前n行,而
tail
相应地读取文本文件的最后n行

整个代码段对应于

以open(os.environ['TMP'])作为输入文件,以open(os.environ['H_TMP'],'w')作为输出文件:
对于inputfile中的行:
#sed的//[\t]+///g'是re.sub(…)
#翻译。。。较低()
line=re.sub(r'\s+','',line).lower()
outputfile.write(行)
#head--lines=1--在一行之后退出
打破
正则表达式escape
\s
匹配许多不同的空白字符;如果您的输入是简单的ASCII码,它将与简单字符类
[\t]
重叠。我们只能猜测,如果确实要处理Unicode,是否需要严格匹配这两个字符

为了获得最大的紧凑性,您可以将其降低到

以open(os.environ['TMP'])作为输入文件,以open(os.environ['H_TMP'],'w')作为输出文件:
outputfile.write(re.sub(r'\s+','',inputfile.readline()).lower())
如果您想读取固定数量的行,而该数字不是1,可以查看
enumerate()

以open(os.environ['TMP'])作为输入文件,以open(os.environ['H_TMP'],'w')作为输出文件:
对于行号,枚举中的行(inputfile,1):
line=re.sub(r'\s+','',line).lower()
outputfile.write(行)
如果lineno==234:
打破

-n,--line=[-]K打印前K行,而不是前10行;以“-”开头,打印每个文件的最后K行以外的所有行
我想最好在
tr
之前执行
head
命令,也许您尊敬的脚本作者不知道您可以将
lsload
的输出传递到
tr
而不将其保存到中间的文件中?@corentilimier
tr
只能读取足够的内容输入填充管道缓冲区,直到
head
从缓冲区读取数据。交换它们可能会节省一些内存,这取决于最初读取的
head
的数量。请查看一下,以便在Python中实际使用它,不过,循环是不必要的。只需使用
line=next(inputfile)
line=inputfile.readline()
。是的,我想如果未来的访问者想阅读一些数字不是1的行,将其显示为循环会更容易。