第一年使用 Linux 学习老师在终端上制作的游戏外壳。我们被要求删除水平方向上单词之间的空格(除了 \n ),将字母从大写更改为小写,然后将结果传输到新文件中。
我很确定这一行命令是好的。一旦我使用 cat newfile 显示它。
这是我的命令:
sed -i 's/.*/\U&/' old file | tee newfile
但是,它不接受它。为什么不起作用?有人可以向我解释我做错了什么吗?
答案1
我至少可以看到三件事:
修改
\U
器转换到大写,而您被要求转换从大写到小写您的表达式似乎根本没有删除空格 - 这可能是最容易作为单独的表达式执行的操作,例如
s/ //g
or (更普遍地替换水平空白)s/[[:blank:]]//g
当您想要将命令的输出重定向或通过管道传输到另一个文件或进程时,使用
-i
(或--in-place
) 没有意义。
因此,将所有这些放在一起,您可以使用
sed -e 's/[[:blank:]]//g' -e 's/.*/\L&/' oldfile > newfile
如果您想oldfile
先就地修改,然后newfile
使用重定向传输内容,您至少可以在 GNU sed 中使用以下命令来执行此操作:
sed -i.bak -e 's/[[:blank:]]//g' -e 's/.*/\L&/' -e 'w /dev/stdout' oldfile | tee newfile
请注意,您需要显式写入,因为使用/dev/stdout
该选项时默认情况下修改的文件不会写入标准输出。-i
或者(更简单),移动或复制修改后的文件:
sed -i.bak -e 's/[[:blank:]]//g' -e 's/.*/\L&/' oldfile && cp oldfile newfile