如何指示 BSD sed 解釋 \n 和 \t 等轉義序列?

如何指示 BSD sed 解釋 \n 和 \t 等轉義序列?

sed我有一個 sed 替換命令,我希望它與 BSD以及 GNU相容sed。擴展正規表示式不是問題,因為在這種情況下我不需要它們。我的主要問題是兩個seds 解釋字元轉義序列的方式不同替代品字串。我的替換字串包含製表符和換行符,我希望它們在命令字串中可見,以便於維護,但是,BSDsed不解釋轉義序列,而 GNUsed sed在 BSD 上指示解釋這些轉義序列的適當方法是什麼?以下兩個片段概括了我的問題:

GNUsed

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

產量

A
    B
C

BSDsed

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

產量

AntBnC

顯然,BSD 不會將\n和解釋為轉​​義序列\tsed

現在,回答我的問題。根據 BSDsed手冊頁:

若要在替換字串中指定換行符,請在其前面加上反斜線。

這是否意味著我需要先文字用反斜線換行?指示解釋替換文本中的sed轉義序列的適當方法是什麼?\n

答案1

$'...'您可以在將字串傳遞給 之前使用 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.

答案2

如果您需要編寫可移植腳本,您應該堅持使用POSIX標準(又稱單一 Unix 又稱開放組基本規範)。第 7 期,又稱 POSIX-1.2008是最新的,但是很多系統還沒有完成採用它。第 6 期又稱 POSIX-1.2001基本上所有現代的unices都提供了。

sed\t,類似於和 的轉義序列的含義\n是不可移植的,除了在正規表示式,\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在每個字串文字中進行反斜線轉義,包括八進制轉義。

答案3

Stack Overflow 上已經回答了這個問題:

https://stackoverflow.com/questions/1421478/how-do-i-use-a-new-line-replacement-in-a-bsd-sed

和 jw013 說的差不多。

為了插入文字製表符,請鍵入ctrl+ VTab

相關內容