プレフィックスとサフィックスの間の内容を削除する方法

プレフィックスとサフィックスの間の内容を削除する方法

接頭辞と接尾辞(複数行)の間の内容だけを削除したいと思います。私のプレフィックスとサフィックスは削除しないでください。

私はこれを試しましたが、私のプレフィックスとサフィックスは削除されました。

sed -i "/prefix =/,/suffix =/d" myfile.txt

コンテンツ:

prefix = Content that i want to delete.
That includes multiple lines as
well as ASCII characters.
suffix = ,

出力:

prefix = 
suffix = ,

答え1

1つの可能な方法は、awkを使用して=フィールド区切り文字として使用することです。

$ awk -F'=' 'BEGIN{OFS="=";};/^prefix/{$2=""; print; noprint=1};/^suffix/{noprint=0;print};noprint{next;};' input.txt
prefix =
suffix = ,

サフィックスの前後に別のコンテンツを取得するには、少し変更して同じ方法を使用できます。

$ awk -F'=' '/^prefix/{$2=""; printf "%s%s\n",$1,FS; noprint=1};/^suffix/||!noprint{noprint=0;print};noprint{next;};' input.txt
things beforeprefix
prefix =
suffix = ,
things after suffix

もちろん、次のように短縮できます。

$ awk 'BEGIN{FS=OFS="=";};/^prefix/{p=1;$2="";print};/^suffix/{p=0};!p' input.txt
things beforeprefix
prefix =
suffix = ,
things after suffix

答え2

次のコマンドを試してみましたが、正常に動作しました。

sed -n '/prefix/,/suffix/p' file.txt| awk '/prefix/||/suffix/{print $0}'| sed '/prefix = /s/=.*/=/g' >file_tmp.txt && mv file_tmp.txt file.txt

出力

prefix =
suffix = ,

答え3

ファイルの行を編集するには、次のコマンドを送信しますed

printf '%s\n' '/^prefix =/+1,/^suffix =/-1d' '1,$s/^prefix = .*/prefix =/' 'wq' |ed -s myfile.txt

これは改行で区切られた3つのコマンドを送信します(オプションを使用してmyfile.txtをed起動して自動的に処理するように指示します)。-s

  • /^prefix =/+1,/^suffix =/-1d- 範囲の行を削除する:「prefix =行の先頭に一致する行の後の行」〜「行の先頭に一致するsuffix =行の前の行」
  • 1,$s/^prefix = .*/prefix =/- 検索と置換:ファイルの各行から行prefix =の先頭にあるパターンをテキストに置き換えたり、何も入れたりしません。prefix =
  • wq-wファイルをディスクに書き戻してq終了します。ed

これはファイルと希望の翻訳についていくつかの仮定をします。

  • prefixtheとサフィックスの間には少なくとも1行が必要です。
  • prefix =すべての末尾のテキストを削除したい
  • 「セクション」が1つしかないので、prefix更新するsuffix必要があります。

答え4

あなたの要件に応じてこれを試すことができます:

$ sed -ne '
   /^\(prefix =\).*/,/^\(suffix =.*\)/!p
   s//\1/p
' myfile.txt

関連情報