Bashスクリプトのsed:不明なコマンド:「」

Bashスクリプトのsed:不明なコマンド:「」

Bashスクリプトでsedアポストロフィを含むコマンドを使用する方法はありますか?それともそうでないようにコマンド'を変更する必要がありますか?sed'

たとえば、次のbashスクリプトを実行したいとします。

#!/bin/bash

cat file.txt | sed $'s|^\(some-string\)|\f\\1|'

このsedコマンドは、some-stringinsideが表示されるたびに改行文字を追加する必要があります。スクリプトがcatコマンドのみを実行しているように見えるため、これは機能しません。

"また、コマンドの周りに引用符を追加してみましたsed

cat file.txt | sed "$'s|^\(some-string\)|\f\\1|'"

エラーを返します。

sed: -e expression #1, char 2: unknown command: `''`

sh script.sh.

答え1

$'...'C文字列の場合、\fこれはフォームフィード文字(FF、^ L)です。改行文字は\n改行文字(LF、^ J)です。標準では、sedコマンドの代替部分にsLF\が続く文字を挿入する必要があります。

だからあなたは以下が欲しい:

#! /bin/sh -
< file.txt sed '
  s|^some-string|\
&|'

そして$'...'

#! /bin/bash -
< file.txt sed $'s|^some-string|\\\n&|'

GNU実装では、改行/ LFを表すために置換を使用することもsedできます。\n

#! /bin/sh -
< file.txt gnu-sed 's|^some-string|\n&|'

いずれにせよ、sedこのコマンドにはアポストロフィは渡されません。'...'$'...'シェルの引用演算子です。最初(標準)は内部コンテンツをそのままに配信するために使用されsed、2番目(ksh93拡張は現在を含むいくつかの他のシェルでサポートされているbash)に配信する前にその中のシーケンスを拡張するために使用されます\f。はい、。\nsed

たとえば、sを置き換えるコマンドなど、リテラル'をに渡したい場合は、渡すことを許可するシェル引用演算子を使用できます。これにはすべての引用演算子が含まれます。sedy/'/"/'"'とは別に '...'それ自体:

sed $'y/\'/"/'  # $'...' quoting operator
sed "y/'/\"/"   # "..." quoting operator
sed y/\'/\"/    # \x quoting operator

答え2

Posixly sedがこれを達成する方法は次のとおりです。

$ sed -e '/^some_string/!b'  - e 'H;s/.*//;x' filename 

関連情報