Bash 删除直到 null

jag*_*og5 3 bash null pipe delimiter

我正在尝试删除输入流中直到并包括第一个空字符的所有字符。

我已经尝试过这个,其中:

  1. 使用 echo 创建包含两行的输入。每行中间都有一个 0。
  2. 使用translate 将 0 转换为 null。现在我们有两行,中间都有空。
  3. 使用 cut (尝试的解决方案)
  4. 使用od查看输出
$ echo $'ab012\nab012' | tr '0' '\0' | cut -f2- -d '' | od -An -t uC
  49  50  10  49  50  10
Run Code Online (Sandbox Code Playgroud)

od 的输出为:1, 2, \n, 1, 2, \n。

该解决方案是不正确的,因为 cut 将此操作应用于每一行,而不是仅从头开始。正确的输出应该是:1, 2, \n, a, b, \0, 1, 2, \n。

我该如何实现这一目标?

M. *_*din 5

如果你有 GNU sed

echo $'ab012\nab012' | tr '0' '\0' | sed -z '1d' | od -tx1
Run Code Online (Sandbox Code Playgroud)

-z选项sed是 GNU 扩展。

或者,一种纯粹的bash方式,如评论中所述:

echo $'ab012\nab012' | tr '0' '\0' | { read -r -d ''; cat; } | od -tx1
Run Code Online (Sandbox Code Playgroud)

当与选项一起使用时-d '',bash 内置命令read将在读取 NUL 字符时终止一行。

  • `{ IFS= read -rd'';cat;} <input_with_null >output_truncated_from_up_to_null` (2认同)