GNU Sed 用 tab aa 分隔符中断吗?

GNU Sed 用 tab aa 分隔符中断吗?

我想知道这里出了什么问题。使用空格作为分隔符可以,但使用制表符似乎不行。

% sed --version
sed (GNU sed) 4.8
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Jay Fenlason, Tom Lord, Ken Pizzini,
Paolo Bonzini, Jim Meyering, and Assaf Gordon.

This sed program was built without SELinux support.

GNU sed home page: <https://www.gnu.org/software/sed/>.
General help using GNU software: <https://www.gnu.org/gethelp/>.
E-mail bug reports to: <[email protected]>.
% sed "s ^ foo " <<<hi
foohi
% sed "s\t^\tfoo\t" <<<hi
sed: -e expression #1, char 11: unknown option to `s'

为什么制表符不能用作分隔符。我可以确认制表符转义序列已正确扩展。

% echo sed "s\t^\tfoo\t" | cat -vT
sed s^I^^Ifoo^I

答案1

您传递的\是分隔符,而不是制表符。

sed 's\ stuff \ otherstuff \' <<<' stuff '

t是命令的未知标志s,因此出现错误

sed "s\t^\tfoo\t"
     ^            - command
       ^^         - regex
      ^  ^    ^   - delimiter
          ^^^^    - replacement string
               ^  - invalid flag to `s` command.

为什么制表符不能用作分隔符

是的 - 传递文字制表符,而不是两个字符\,并且t

sed $'s\t^\tfoo\t' <<<hi
# or
tab=$(printf '\t')
sed "s/${tab}^${tab}foo%{tab}" <<<hi

我可以确认制表符转义序列

您可以确认使用 echo 时在你的壳里回声将序列替换\t为制表符。这不会产生sed任何影响。例如,您可以将 echo 的结果传递给 sed。

# will work in zsh without BSD_ECHO option
sed "$(echo 's\t^\tfoo\t')" <<<hi
# to be portable use printf
sed "$(printf 's\t^\tfoo\t')" <<<hi

https://zsh.sourceforge.io/Doc/Release/Shell-Builtin-Commands.html

答案2

并非所有版本的 sed 都理解\t

来自帖子的解决方案 为什么 sed 不能将 \t 识别为制表符

  • 插入文字制表符:按 Ctrl+V然后Tab

  • 创建包含制表符的变量并将 TAB=$'\t'其用作{TAB}

  • 在单引号字符串前面放置一个美元符号: sed $'s\t^\tfoo\t'

相关内容