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;&/"