\n や \t などのエスケープシーケンスを解釈するように BSD sed に指示するにはどうすればよいですか?

\n や \t などのエスケープシーケンスを解釈するように BSD sed に指示するにはどうすればよいですか?

sedBSDおよびGNUと互換性があることを望むsed代替コマンドがありますsed。拡張正規表現はこの場合は必要ないので問題になりません。私の主な問題は、2つがsed文字エスケープシーケンスを別々に解釈することです代替ひも。私の代替文字列にはタブと改行文字が含まれており、メンテナンスを容易にするためにコマンド文字列に表示したいと思います。しかし、sedGNUでは、BSDはエスケープシーケンスを解釈しません。sed するsedBSDでこれらのエスケープシーケンスの解釈を表す適切な方法は何ですか?次の2つの部分は私の問題を要約します。

牛に似た一種の栄養sed

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

生産する

A
    B
C

BSDsed

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

生産する

AntBnC

明らかにBSDは\n解釈されず、エスケープシーケンスとして\tsed

今私の質問に答えてください。 BSDのsedマニュアルページによると:

代替文字列に改行文字を指定するには、その前にバックスラッシュを追加します。

これが私が最初にしなければならないという意味ですか?言葉バックスラッシュで改行?代替テキストでエスケープシーケンスの解釈を表す適切な方法は何ですか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としても知られています。デフォルトでは、すべての最新のユニスが提供されます。

存在するsed\t、エスケープシーケンスの意味は次のようになり、以下を\n除いて移植可能ではありません。正規表現\n改行文字を表します。コマンドの代替テキストではs移植\n可能ではありませんが、バックスラッシュ - 新しい行の順序を使用して新しい行を表すことができます。

タブ文字(または8進数で表される他の文字)を生成する移植可能な方法は次のとおりです。tr。シェル変数に文字を保存し、sed スニペットで変数を置き換えます。

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

s改行文字は、正規表現と代替テキストで異なる方法で表現する必要があることに注意してください。

使いたいかもしれませんアッ代わりに。\ooo8進エスケープを含むすべての文字列リテラルでバックスラッシュエスケープを許可します。

答え3

この質問はStack Overflowに回答されています。

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

jw013が言ったのとほぼ同じです。

テキストタブを挿入するにはctrl+と入力しますVTab

関連情報