変数(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
変数の内容はの内容の各項目の前に挿入されます。perl
perl
pattern
abc.txt
Bourneなどのシェルのx
変数を除くすべての文字に文字を割り当てるには、次のようにします。'
a='x'
したがって、バックスラッシュの場合:
a='\'
改行文字の場合:
a='
'
改行などの制御文字の場合はさらに悪化しますが、バックスペースやキャリッジリターン文字の場合はさらに悪化し、コードが明確になる可能性があります。
$'...'
ksh93では、これらの文字をエスケープ形式で指定するために新しい形式の引用を導入しました。bash
FreeBSDzsh
やmksh
FreeBSDなどの他のシェルは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
答え2
独自の bash コマンドを使用することもできます。
cat abc.txt | sed -e 's/how/\nhow/g' | while read line; do echo "$line \\"; done