查找';在bash和awk(perl)中重新实现print0选项

查找';在bash和awk(perl)中重新实现print0选项,bash,printing,null,find,character,Bash,Printing,Null,Find,Character,我已成功编写了以下函数: function print0(){ stdin=$(cat); echo "$stdin" | awk 'BEGIN {ORS="\000";}; { print $0}'; } 它在find命令中用作-print0参数,但基本上用于将其输出传递到此函数的任何命令。它对xargs-0很有用。然后我意识到这个函数的反面也会很有用。我尝试过以下方法: function read0(){ stdin=$(cat); echo "$stdin" | awk

我已成功编写了以下函数:

function print0(){
  stdin=$(cat);
  echo "$stdin" | awk 'BEGIN {ORS="\000";}; { print $0}';
}
它在
find
命令中用作
-print0
参数,但基本上用于将其输出传递到此函数的任何命令。它对
xargs-0
很有用。然后我意识到这个函数的反面也会很有用。我尝试过以下方法:

function read0(){
  stdin=$(cat);
  echo "$stdin" | awk 'BEGIN {RS="\000"; ORS="\n";};  {print $0}';

  # EQUIVALENTS:
  # echo "$stdin" | perl -nle '@a=join("\n", split(/\000/, $_)); print "@a"'
  # echo "$stdin" | perl -nle '$\="\n"; @a=split(/\000/, $_); foreach (@a){print $_;}'
}
但它不起作用,有趣的是,当我尝试使用命令(awk或perl)时,它就像一个符咒:

# WORKING
ls | print0 | awk 'BEGIN {RS="\000"; ORS="\n";};  {print $0}'
ls | print0 | perl -nle '@a=join("\n", split(/\000/, $_)); print "@a"'
ls | print0 | perl -nle '$\="\n"; @a=split(/\000/, $_); foreach (@a){print $_;}'


# DOES NOT WORKING
ls | print0 | read0
我做错了什么?我假设通过以下命令处理空字符有问题:
stdin=$(cat)

编辑: 谢谢大家,结论是bash变量不能包含null值。
PS:前面提到的命令和我知道的将空值转换为换行符以及将空值转换为换行符没有合理的原因。

正如其他答案/注释所提到的,您不能在bash字符串变量中放入空字符。但是,如果您可以去掉变量,只处理管道/流中的数据,则可以通过以下方式传递空字符:

function print0() { awk 'BEGIN {ORS="\000";}; {print $0}'; } function read0() { awk 'BEGIN {RS="\000"; ORS="\n";}; {print $0}'; }
正如其他答案/注释所提到的,不能在bash字符串变量中放入空字符。但是,如果您可以去掉变量,只处理管道/流中的数据,则可以通过以下方式传递空字符:

function print0() { awk 'BEGIN {ORS="\000";}; {print $0}'; } function read0() { awk 'BEGIN {RS="\000"; ORS="\n";}; {print $0}'; }
正如其他答案/注释所提到的,不能在bash字符串变量中放入空字符。但是,如果您可以去掉变量,只处理管道/流中的数据,则可以通过以下方式传递空字符:

function print0() { awk 'BEGIN {ORS="\000";}; {print $0}'; } function read0() { awk 'BEGIN {RS="\000"; ORS="\n";}; {print $0}'; }
正如其他答案/注释所提到的,不能在bash字符串变量中放入空字符。但是,如果您可以去掉变量,只处理管道/流中的数据,则可以通过以下方式传递空字符:

function print0() { awk 'BEGIN {ORS="\000";}; {print $0}'; } function read0() { awk 'BEGIN {RS="\000"; ORS="\n";}; {print $0}'; }
我想说的是,您的实现可以简化为

function print0 { tr '\n' '\0'; }
function read0  { tr '\0' '\n'; }
这是你想要的

但是,它没有增加任何价值;您只需从新行分隔记录切换到
NUL
分隔记录,反之亦然,而
查找-print0可以处理多行文件名。你的想法解决不了那个问题

您的问题的实际观点-如何在bash中处理嵌入
NUL
字符的字符串-已在SO上讨论过:。底线是,你必须逃离他们。除此之外,zsh支持嵌入式
NUL
字符,但显然没有其他shell支持


有一个关于
read
shell内置的
NUL
字符处理的例子,您可能会发现这很有趣。

我想说,您的实现可以简化为

function print0 { tr '\n' '\0'; }
function read0  { tr '\0' '\n'; }
这是你想要的

但是,它没有增加任何价值;您只需从新行分隔记录切换到
NUL
分隔记录,反之亦然,而
查找-print0可以处理多行文件名。你的想法解决不了那个问题

您的问题的实际观点-如何在bash中处理嵌入
NUL
字符的字符串-已在SO上讨论过:。底线是,你必须逃离他们。除此之外,zsh支持嵌入式
NUL
字符,但显然没有其他shell支持


有一个关于
read
shell内置的
NUL
字符处理的例子,您可能会发现这很有趣。

我想说,您的实现可以简化为

function print0 { tr '\n' '\0'; }
function read0  { tr '\0' '\n'; }
这是你想要的

但是,它没有增加任何价值;您只需从新行分隔记录切换到
NUL
分隔记录,反之亦然,而
查找-print0可以处理多行文件名。你的想法解决不了那个问题

您的问题的实际观点-如何在bash中处理嵌入
NUL
字符的字符串-已在SO上讨论过:。底线是,你必须逃离他们。除此之外,zsh支持嵌入式
NUL
字符,但显然没有其他shell支持


有一个关于
read
shell内置的
NUL
字符处理的例子,您可能会发现这很有趣。

我想说,您的实现可以简化为

function print0 { tr '\n' '\0'; }
function read0  { tr '\0' '\n'; }
这是你想要的

但是,它没有增加任何价值;您只需从新行分隔记录切换到
NUL
分隔记录,反之亦然,而
查找-print0可以处理多行文件名。你的想法解决不了那个问题

您的问题的实际观点-如何在bash中处理嵌入
NUL
字符的字符串-已在SO上讨论过:。底线是,你必须逃离他们。除此之外,zsh支持嵌入式
NUL
字符,但显然没有其他shell支持


关于
read
shell内置的
NUL
字符的处理,已经有了一系列的研究,您可能会发现这很有趣。

+1有趣。但无法帮助您。shell在内部使用C字符串,而C使用
\0
作为字符串终止符。所以你不能把它作为字符串中的一个字符,它只会结束它。+1有趣。但无法帮助您。shell在内部使用C字符串,而C使用
\0
作为字符串终止符。所以你不能把它作为字符串中的一个字符,它只会结束它。+1有趣。但无法帮助您。shell在内部使用C字符串,而C使用
\0
作为字符串终止符。所以你不能把它作为字符串中的一个字符,它只会结束它。+1有趣。但无法帮助您。shell在内部使用C字符串,而C使用
\0
作为字符串终止符。所以你不能把它作为字符串中的一个字符,它只会结束它。我认为“\0”和“\000”在任何awk上应该是相同的——至少,它们在我碰巧可以访问的三个awk上——但是将
ORS
设置为
NUL
,请注意