GNU/Linux >> Linux の 問題 >  >> Linux

Sed:指定された文字列の前後のN番目の文字の後にテキストを挿入しますか?

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

Linux
  1. 一致するテキストを見つけて次の行を置き換える

  2. テキスト ファイルの各行で n 番目に出現する文字列を置き換えます

  3. シェルスクリプトから、特定の行を出力した後にプログラムを強制終了します

  1. バックスラッシュ文字で終わるすべての行を組み合わせるにはどうすればよいですか?

  2. Sedを使用してテキストファイルから複数のランダム行を削除する方法は?

  3. Sedを使用して文字列の最初の文字をラップしますか?

  1. Sedを使用して、一致する文字列のN番目の位置に文字を追加しますか?

  2. テキスト ファイル内の文字列を削除する

  3. ファイルの先頭にテキストを挿入する方法は?