一つ交換可能ですか?空の文字列テキスト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
空の入力を検出して文字列を挿入するには、ifne
moreutilsパッケージとその-n
オプションを使用できます。
$ printf '' | ifne -n echo sometext
sometext
これは、標準入力ストリームで入力が検出されない場合にのみ実行されますecho sometext
。ifne
パイプの左側にある場合する出力するデータを生成します。
$ 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がgrep
null文字を出力する場合は、いくつかのコマンドを使用してそれを検出して置き換えることができるということです。
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'