パターンの前にバックスラッシュと改行文字を挿入するには?

パターンの前にバックスラッシュと改行文字を挿入するには?

変数(aと仮定)で\ nをキャプチャし、ファイル(abc.txt)で検索パターンの前の$ aを置き換えたいと思います。

誰でも私に解決策を提案できますか?

> cat abc.txt
hi how are you how is your health
> echo $a
\

期待される出力(検索パターン - how

hi \
how are you \
how is your health

ベストアンサー1

Bourneのようなまたはrcのようなシェルから

a='
' perl -pe 's/pattern/$ENV{a}$&/g' < abc.txt

改行文字を含む環境変数が渡され、そのa変数の内容はの内容の各項目の前に挿入されます。perlperlpatternabc.txt

Bourneなどのシェルのx変数を除くすべての文字に文字を割り当てるには、次のようにします。'

a='x'

したがって、バックスラッシュの場合:

a='\'

改行文字の場合:

a='
'

改行などの制御文字の場合はさらに悪化しますが、バックスペースやキャリッジリターン文字の場合はさらに悪化し、コードが明確になる可能性があります。

$'...'ksh93では、これらの文字をエスケープ形式で指定するために新しい形式の引用を導入しました。bashFreeBSDzshmkshFreeBSDなどの他のシェルはshそれをコピーして拡張しました($'\uXXXX'で追加したようにzsh)。

このシェルでは、次のものを使用できます。

a=$'\n' a=$'\b' a=$'\r' a=$'\\' a=$'\''

改行、バックスペース、キャリッジリターン、バックスラッシュ、または一重引用符文字を指定します。

この参照演算子はまだ標準ではないため、移植可能なshスクリプトでは使用できません。標準的な代替方法は、次のものを使用することです。

a=$(printf '\b')

$(cmd)たとえば、バックスペースの場合、コマンド置換()は出力から末尾の改行を削除するため、改行には機能しませんcmd。人々は次のハッカーに頼らなければなりません。

nl=$(printf '\n.'); nl=${nl%.}

(つまり、1つを追加して.から削除します)。

また、コードでこれらの記号をperl理解しているので、次のことができます。\n

perl -pe 's/pattern/\n$&/g' < abc.txt

GNU実装sed(および現在他のいくつかの実装)もこれをサポートしています。

sed 's/pattern/\n&/g' < abc.txt

しかし、これは標準ではありません。標準によれば、sコマンド置換部分の改行はsedバックスラッシュと実際の改行で表示する必要があるため、次のようになります。

backslash='\' newline='
'
sed "s/pattern/$backslash$newline&/g" < abc.txt

または変数なし:

sed 's/pattern/\
&/g' < abc.txt

したがって、前にバックスラッシュと改行文字の両方を挿入するには、次のものがpattern必要です。

sed 's/pattern/\\\
&/g' < abc.txt

合計3つのバックスラッシュがあり、2つはリテラルバックスラッシュ用で、1つは改行用です。または以下を使用してperl

perl -pe 's/pattern/\\\n$&/g' < abc.txt

またはa変数を使用してください。

a='\
' perl -pe 's/pattern/$ENV{a}$&/g' < abc.txt

おすすめ記事