如何指示BSD sed解释\ n和\ t之类的转义序列?


14

我有一个sed替换命令,希望与BSD sed以及GNU 兼容sed。扩展正则表达式不是问题,因为在这种情况下,我不需要它们。我的主要问题是两个seds解释替换字符串中字符转义序列的方式不同。我的替换字符串包含制表符和换行符,并且我希望它们在命令字符串中可见以便于维护,但是BSD sed不会解释转义序列,而GNU sed 解释。有什么合适的方法来指示sed在BSD上解释这些转义序列?以下两个片段概括了我的问题:

GNU sed

echo ABC | sed 's/B/\n\tB\n'

产量

A
    B
C

BSD sed

echo ABC | sed 's/B\n\tB\n'

产量

AntBnC

显然,\n\t不会被解释为通过BSD转义序列sed

现在,我的问题。根据BSD手册sed

要在替换字符串中指定换行符,请在其前面加上反斜杠。

这是否意味着我需要在文字换行符之前加反斜杠?有什么合适的方法来指示sed解释\n替换文本中的转义序列?


2
BSD sed不是GNU sed,我不认为它在输出中支持这种转义。您将不得不插入文字字符,安装GNU sed或切换到支持诸如awk之类的转义符的东西。
2012年

@ jw013,我很清楚两者之间的区别。不能安装GNU sed。我希望在两者之间找到足够的共同点,以完成我追求的目标sed。最后,使用awk可能会有意义。那么,您如何看待我引用的BSD sed手册页的解释?
伊夫史密斯,2012年

2
是的,您将需要使用文字制表符和换行符,对于换行符,还需要在它们之前加上反斜杠,这实际上只是行继续机制。
2012年

@ jw013,谢谢您的答复。在这一点上,为了维护起见,我将听取您的建议,并在awk中重新设计我的解决方案。
伊夫史密斯,2012年

不错的选择
-awk

Answers:


6

如果需要编写可移植的脚本,则应坚持POSIX标准(又称“单Unix”又称“开放组基本规范”)中的功能。POSIX-1.2008是最新的Issue 7,但是许多系统尚未完全采用它。POSIX-1.2001即POSIX-1.2001第6期由所有现代联合国大体上提供。

sed中,转义序列的含义类似于\t\n不可移植,只是在regex\n代表换行符。在s命令的替换文本中,该命令\n不是可移植的,但是您可以使用序列反斜杠-换行符来表示换行符。

生成制表符(或八进制表示的任何其他字符)的可移植方法是使用tr。将字符存储在shell变量中,然后将此变量替换为sed片段。

tab=$(echo | tr '\n' '\t')
escape=$(echo | tr '\n' '\033')
embolden () {
  sed -e 's/^/'"$escape"'[1m/' -e 's/$/'"$escape"'[0m/'
}

再次注意,换行符需要在正则表达式和s替换文本中以不同的方式表示。

您可能想使用awk代替。它允许\ooo在每个字符串文字中使用反斜杠转义符,包括八进制转义符。


7

$'...'在将字符串传递到之前,可以使用bash 引号来解释转义sed

在bash手册页中:

   Words  of  the  form  $'string'  are  treated specially.  The word
   expands to string, with backslash-escaped characters  replaced  as
   specified  by the ANSI C standard.  Backslash escape sequences, if
   present, are decoded as follows:
          \a     alert (bell)
          \b     backspace
          \e     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \'     single quote
          \nnn   the eight-bit character whose  value  is  the  octal
                 value nnn (one to three digits)
          \xHH   the eight-bit character whose value is the hexadeci-
                 mal value HH (one or two hex digits)
          \cx    a control-x character

   The expanded result is single-quoted, as if the  dollar  sign  had
   not been present.

   A  double-quoted  string  preceded by a dollar sign ($) will cause
   the string to be translated according to the current  locale.   If
   the  current locale is C or POSIX, the dollar sign is ignored.  If
   the string is translated and replaced, the replacement is  double-
   quoted.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.