複数のsed文のsedインライン編集が失敗する

複数のsed文のsedインライン編集が失敗する

#SB#与えられた文字列に一致する各行の先頭に追加したい

inkron.sh

sed -i -e'/test1/s/^/#SB#/g' file1
sed -i -e'/test2/s/^/#SB#/g' file1
sed -i -e'/test4/s/^/#SB#/g' file1

ファイル1

/apps/pmserver $ cat file1
00 45 /ser/bat/ab.sh test1
00 45 /ser/bat/ab.sh test2
00 45 /ser/bat/ab.sh test3
00 45 /ser/bat/ab.sh test4
/apps/pmserver $

私はコーエンシェルを使用しています。

sed新しいファイルとして出力できますが、スクリプトに複数の文がある場合(上記の図を参照)、機能しません。エラーが発生しました。

sed: Not a recognized flag: i

私がやりたいことは、crontab特定のチームに属するいくつかのアイテムをコメントアウトすることです。 test1 test2...は対応するファイル名なので、閉じる必要があります。

答え1

sedのパラメータは-iGNU拡張です。 GNU sedを実行していない可能性があるため、-i認識されないというエラーが発生します。

答え2

あなたのsedは(おそらく)GNUではないので、内部編集のために-iをサポートしません。一時ファイルを使用すると、これを防ぐことができます。

sed -i -e'/test1/s/^/#SB#/g' file1

~になる

sed -e'/test1/s/^/#SB#/g' file1 > temp_file
mv temp_file file1

もちろん、このようにmktempを使用すると、より良いことができます。

tmpfile=`mktemp`; sed -e '/test1/s/^/#SB#/g' file1 > $tmpfile; mv $tmpfile file1

完全に避ける元のファイルが切り捨てられるため、一時ファイルなしでsedとリダイレクトを実行します。

答え3

ExモードでVimを使用できます。

ex -sc 'g/\vtest(1|2|4)/s/^/#SB#/' -cx file1
  1. gグローバル正規表現

  2. \v魔法をかける

  3. s変える

  4. x保存して閉じる

答え4

回答では、これが-i非標準であることを説明し、一時ファイルを使用する方法も説明しますが、複数のステートメントに対してこれを行う方法に関する主な問題を無視します。

もちろん、各ステートメントをリダイレクトして各ステートメントの後にコピーすることもできます。ただし、とにかくsed各ステートメントに対して個別の呼び出しは必要なく、次のように複数のスクリプトを指定できます-e

sed -e '/test1/s/^/#SB#/g' -e '/test2/s/^/#SB#/g' -e' /test4/s/^/#SB#/g' file1

sedまたは、次を使用してコマンドをリンクできます;

sed '/test1/s/^/#SB#/g;/test2/s/^/#SB#/g;/test4/s/^/#SB#/g' file1

あなたの例では、代替項目を結合する正規表現を見つけることもできます。

sed '/test[124]/s/^/#SB#/g' file1

スクリプトを改善すると、コマンドgのフラグはs「行内のすべての項目を置き換える」を意味しますが、各行には開始(^)のみがあるため、これを削除できるため、最終的な作業は次のようになります。

sed '/test[124]/s/^/#SB#/' file1 > /tmp/file1 && mv /tmp/file1 file1

(失敗時のファイル破損を&&防ぐために使用されます)sed

関連情報