sed または同様のツールを使用して、空の文字列をテキストに置き換えます。

sed または同様のツールを使用して、空の文字列をテキストに置き換えます。

一つ交換可能ですか?空の文字列テキストsedや類似のツールを使用していますか?

sed 's/^$/sometext/'

一致空行しかし、それは私が望むものではありません。私は思った

sed 's//sometext/'

効果があるようですが、そうでないようです。


grepこの特別な場合は、不一致を検出したいと思います。

echo 'hi' | grep 'sam' | ...

答え1

sed空白行を置き換えるには、空白行を入力する必要があります。

空行自体は改行文字です。これはechoまたはを使用して作成できますprintf '\n'

$ printf '\n' | sed 's/^$/sometext/'
sometext
$ echo | sed 's/^$/sometext/'
sometext

置き換えられます。みんな他の行が空でないかどうかに関係なく、入力の空行です。

$ printf '%s\n' "line 1" "" "line 3" | sed 's/^$/sometext/'
line 1
sometext
line 3

空の入力を検出して文字列を挿入するには、ifnemoreutilsパッケージとその-nオプションを使用できます。

$ printf '' | ifne -n echo sometext
sometext

これは、標準入力ストリームで入力が検出されない場合にのみ実行されますecho sometextifneパイプの左側にある場合する出力するデータを生成します。

$ printf 'hello\n' | ifne -n echo sometext
hello

不一致検出に関する追加情報は次のとおりですgrep

echo 'hi' | grep -q 'sam' || echo no match

または段落ロジックifの代わりに、then

if ! echo 'hi' | grep -q 'sam'; then
    echo no match
fi

これはgrep対応する-qオプションと組み合わせて使用​​され、ユーティリティは非常に静かで終了ステータスのみを使用して一致成功または失敗信号を送信します。 e が一致しない場合、ゼロ以外の終了状態で終了します。上記のコードはこれを検出して実行しますecho no match

答え2

私の考えは、一致するものがない場合、またはprintf ''aがgrepnull文字を出力する場合は、いくつかのコマンドを使用してそれを検出して置き換えることができるということです。

printf ''一致しないAとaはgrep合計0バイトで出力されます。これは\0、置き換える内容がないNUL()バイトとは異なります。

長さゼロの文字列と一致する正規表現は、通常、印刷などのprintf 'foo\n' | sed -E 's/.{0}/X/g'すべての文字間で一致するため、使用できませんXfXoXoX。 (sed -e 's//.../'sedでは、空の正規表現は以前の正規表現を再利用するという意味なので、まったく機能しません。)

別の方法で空の入力を検出する必要があります。

次のAWKスクリプトは、すべての入力行を出力にコピーするか、存在しない場合は印刷しますnew text

$ printf '' | awk '1; END { if (NR == 0) printf "new text\n"; }'
new text
$ printf 'xxx\nyyy' | awk '1; END { if (NR == 0) printf "new text\n"; }'
xxx
yyy

NR実際には入力に「レコード」の数が含まれています。欠落している場合は、最後の行に末尾の改行が追加されます。)

答え3

@Kamil Maciorowskiがコメントで指摘したように、特定の場合にgrep解析できます。終了コードその代わりに標準出力:

$ echo 'hi' | grep 'bye' || echo 'sam'
sam

これにより、発生したすべての一致も処理できます。

$ echo 'hi' | grep 'hi' || echo 'sam'
hi

一致を抑制するには、grep次のオプションを使用します-q

$ echo 'hi' | grep -q 'hi' || echo 'sam'

関連情報