echo "Hello"| tr -d '\42' | tr -d '\n' | tr -d '\r' | od -v -A n -tx1 | sed "s/ //g"
字符串 或在CMD文件中为:
@echo "%1"| tr -d '\42' | tr -d '\n' | tr -d '\r' | od -v -A n -tx1 | sed "s/ //g"
型 我的解决方案的一个限制是它将删除所有双引号(“)。
"tr -d '\42'" removes quote marks that the Windows 'echo' will include.
"tr -d '\r'" removes the carriage return, which Windows includes as well as '\n'.
The pipe (|) character must follow immediately after the string or the Windows echo will add that space after the string.
There is no '-n' switch to the Windows echo command.
5条答案
按热度按时间t30tvxxf1#
字符串
说明:
echo
程序将为下一个命令提供该字符串。-n
标志告诉echo不要在“Hello”的末尾生成新行。od
程序是“八进制转储”程序(我们将提供一个标志,告诉它以十六进制而不是八进制转储)。-A n
标志是--address-radix=n
的缩写,n是“none”的缩写。如果没有这一部分,命令将在左侧输出一个丑陋的数字地址前缀。这对大型转储很有用,但对短字符串来说没有必要。-t x1
旗标是--format=x1
的缩写,其中x是“十六进制”的缩写,1表示1个字节。更多详细信息,请ExplainShell.com:https://explainshell.com/explain?cmd=echo+-n+%22Hello%22+%7C+od+-A+n+-t+x1
2guxujil2#
如果你想这样做,并删除你需要的空间:
字符串
流水线中的前两个命令已经很好地解释了in this other answer。最后一个命令与其中一个注解的不同之处在于它既正确又经过测试。解释是:
sed
是一个艾德流。s
是s替换命令。/
打开一个正则表达式-任何字符都可以使用。/
是常规的,但不便于处理XML或路径名。/
或您选择的替换字符,关闭正则表达式并打开替换字符串。/ */
中,*
匹配前一个字符(在本例中为空格)的任何序列。/
或您选择的替代字符,关闭替换字符串。在这种情况下,替换字符串//
为空,即匹配被删除。g
是一个选项,可以在每一行上全局地进行g替换,而不是每一行只替换一次。sed
,即sed
脚本。sed 's/^ *//'
只从每一行的开头剥离空格(^
匹配行的开头-sed
中的“模式空格”-speak)。如果您还想删除换行符,最简单的方法是追加
型
到命令管道。它的功能如下:
|
将之前处理过的流提供给此命令的标准输入。tr
是translate命令。-d
指定删除匹配字符。\n
)。翻译只匹配单个字符,而不是序列。sed
在处理换行符时很特殊。这是因为sed
是最古老的unix
命令之一。普遍存在的遗留软件使其无法修复。我知道这一点,因为我出生在unix
出生之前。这个问题的历史起源是认为换行符是一个行分隔符,而不是行的一部分。因此,它被行处理实用程序剥离,并由输出实用程序重新插入。麻烦的是,这使得对用户数据的结构做出了假设,并在许多设置中强加了不自然的限制。
sed
无法轻松地删除换行符是这种格式错误的最常见的例子之一。意识形态造成的悲伤。使用
sed
可以删除换行符-只是我知道的所有解决方案都让sed
一次处理整个文件,这对非常大的文件来说是阻塞的,违背了流编辑器的目的。任何保留行处理的解决方案,如果可能的话,都将是一个不可读的多管道老鼠窝。如果您坚持使用
sed
,请尝试:型
-z
告诉sed
使用空值作为行分隔符。在内部,
C
中的字符串以null结束。-z
选项也是遗留的结果,为C
程序员提供方便,他们可能喜欢使用一个临时文件,里面填充了C
-字符串,并且没有换行符。这样他们就可以轻松地一次读取和处理一个字符串。同样,关于用例的早期假设对用户数据强加了人为的限制。如果省略
g
选项,这个命令只删除第一个换行符。使用-z
选项,sed
将整个文件解释为一行(除非文件中嵌入了零星的null),以null结尾,因此这也会在大文件中阻塞。你可能会认为
型
可能会起作用。第一个命令在每行的前面逐行放置一个null,导致
\n\x00
结束每行。第二个命令从每行中删除一个换行符,现在由null分隔-由于第一个命令,只有一个换行符。剩下的都是虚假的null。到目前为止,太好了。这里的坏主意是管道将逐行地提供最后一个命令,因为这就是流的构建方式。实际上,最后一个命令,正如所写的那样,只会删除一个null,因为现在整个文件没有换行符,因此只有一行。简单的管道实现使用一个中间临时文件,所有输入都被处理并馈送到该文件。下一个命令可能正在另一个线程中运行,同时阅读该文件,但它只看到整个流(尽管不完整)并且不知道馈送文件的块边界。即使管道是内存缓冲区,下一个命令将流视为一个整体。2缺陷不可避免地被烘焙到
sed
中。要使这种方法工作,您需要在最后一个命令上使用
g
选项,因此,它在大文件上也会阻塞。底线是:不要使用
sed
来处理换行符。tkqqtvp13#
第一个月
5anewei64#
进一步处理这个问题,一个可行的解决方案是删除“*",如果需要替换实际字符,则原始要求也不需要简单地删除空格,如下所示
字符串
因此,我认为这是对原始Q的改进,因为该语句现在确实需要,而不仅仅是表面上。
4zcjmb1e5#
结合TMS和i-always-rtfm-and-stfw的答案,以下代码在Windows下使用gnu-utils版本的程序'od'、'sed'和'tr'运行:
字符串
或在CMD文件中为:
型
我的解决方案的一个限制是它将删除所有双引号(“)。
型