ファイルの特定の位置に挿入する必要がある文字列があります。
ファイルには複数のセミコロン (;) が含まれています。最後の「;」の直前に文字列を挿入する必要があります。
これは SED で可能ですか?
私はシェルスクリプトが初めてなので、コマンドで説明を投稿してください
前 :
adad;sfs;sdfsf;fsdfs
文字列 = jjjjj
後
adad;sfs;sdfsf jjjjj;fsdfs
前もって感謝します
これはあなたのために働くかもしれません:
echo 'adad;sfs;sdfsf;fsdfs'| sed 's/\(.*\);/\1 jjjjj;/'
adad;sfs;sdfsf jjjjj;fsdfs
\(.*\)
は貪欲で、行全体を飲み込みます。;
は、正規表現を最後の;
. メイクサ\(.*\)
バック リファレンス\1
. コマンドの RHS にすべてをまとめるとは、最後の の前にs
挿入することを意味します。jjjjj
;
sed 's/\([^;]*\)\(;[^;]*;$\)/\1jjjjj\2/' filename
jjjjj
(挿入する必要があるものに置き換えます)。
例:
$ echo 'adad;sfs;sdfsf;fsdfs;' | sed 's/\([^;]*\)\(;[^;]*;$\)/\1jjjjj\2/'
adad;sfs;sdfsfjjjjj;fsdfs;
説明:
sed
次のパターンを見つけます: \([^;]*\)\(;[^;]*;$\)
. エスケープされた丸括弧 ( \(
, ) は番号付きのグループを形成するため、後でおよび\)
として参照できます。\1
\2
[^;]*
は「 以外のすべて;
、何度でも繰り返されます。
$
行の終わりを意味します。
次に、に変更し\1jjjjj\2
ます。
\1
と\2
は、1 番目と 2 番目の丸括弧で一致するグループです。
sed
今のところ、 : =)を使用した短いソリューション
sed -r 's@;([^;]+);$@; jjjjj;\1@' <<< 'adad;sfs;sdfsf;fsdfs;'
/
他の文字に置き換えることができます;
はないものによって仕上げるものを一致させます。つまり、行の終わりを意味します;
$
()
編集:POSIXバージョン(移植性が高い):
echo 'adad;sfs;sdfsf;fsdfs;' | sed 's@;\([^;]\+\);$@; jjjjj;\1@'
sed -e 's/\(;[^;]*\)$/ jjjj\1/'
行末のセミコロンの後に任意の数の非セミコロン ( [^;]*
)が続く部分の前に jjjj を挿入し$
ます。は後方参照\1
と呼ばれ、と の間で一致する文字を含みます。\(
\)
更新:サンプル入力に「;」がなくなったため 最後に。
echo 'adad;sfs;sdfsf;fsdfs;' | sed -r 's/(.*);(.*);/\1 jjjj;\2;/'
; の否定は必要ありません。sed はデフォルトで貪欲で、できるだけ多くの文字を選択するためです。
このようなものがあなたのために働くかもしれません:
echo "adad;sfs;sdfsf;fsdfs"| awk 'BEGIN{FS=OFS=";"} {$(NF-1)=$(NF-1) " jjjjj"; print}'
adad;sfs;sdfsf jjjjj;fsdfs
説明: awk は、FS (フィールドセパレーター) と OFS (出力フィールドセパレーター) をセミコロンとして設定して開始します;
。NF
awk は を表しnumber of fields
ます。$(NF-1)
したがって、last-1 フィールドを意味します。この awk コマンドでは、last-1 フィールドに{$(NF-1)=$(NF-1) " jjjjj"
追加するだけです。jjjjj