sed
を使用する 、 N
で文字列の前(または後)にある文字の後にテキストを挿入するにはどうすればよいですか? 発生。例として、編集するテキストの行が次のようになっているとします。
command -some -args -c 'a quoted section;some;lines;of code;keyword;more lines;etc();'
テキストファイルでこの行を見つけた後(おそらく一意の文字列 command
)、キーワード
の前の2番目(N =2)のセミコロンの後にテキストを挿入したい (つまり、行を区切るセミコロン
およびof
)。特にsed
を使用したい 目的のために。
この例を続けると、期待される出力は次のようになります。
command -some -args -c 'a quoted section;some;lines;INSERTED_STRING;of code;keyword;more lines;etc();'
ここで、 INSERTED_STRING;
(たとえば、シェル変数を介してsedに提供されます)が目的の位置に挿入されました。
承認された回答:
簡単だと思います:
sed '/command/s/[^;]*;keyword/INSERTED_STRING;&/'
キーワードの前に2つのフィールドを挿入します。一般的な解決策は次のとおりです
sed "/command/s/\([^;]*;\)\{$N\}keyword/INSERTED_STRING;&/"
ただし、 N
に注意してください あなたの質問と比較して1のオフネットがあります:ここでは、 N =2
挿入とキーワード
の間に2つのフィールドがあることを意味します 。
説明: / command /
コマンド
の行のみを選択します 、したがって、他の行は変更されません。 ([^;] *; \)コード> 次のセミコロンを含む1つのフィールド(非セミコロンのシーケンス)に一致します。
\ {$ N \}
を続けてください パターンは$N
と一致します 田畑。次のキーワード
キーワード
に一致するようにこれを完了します および$N
前のフィールド。置換パターンは、挿入された文字列と&
で構成されます 、一致したすべてのものに置き換えられます(つまり、最終的には置き換えではなく、挿入物でした)。
短縮され、拡張正規表現で読みやすくなりました:
sed -E "/command/s/([^;]*;){$N}keyword/INSERTED_STRING;&/"