
#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のパラメータは-i
GNU拡張です。 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
g
グローバル正規表現\v
魔法をかけるs
変える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