HISTTIMEFORMATと一致する履歴エントリを削除する

HISTTIMEFORMATと一致する履歴エントリを削除する

特定の文字列に一致するすべての履歴エントリを削除したいです。私が見つけた この方法:

grep -v searchstring "$HISTFILE" > /tmp/history
mv /tmp/history "$HISTFILE"

ただし、HISTTIMEFORMAT コメントは考慮しません。たとえば、次のようになります。

#1517681911
echo 1
#1517681918
echo 2
#1517681931
echo 3

「echo 2」を削除するには、前のコメントも削除する必要があります。どうすればいいですか?

答え1

sedはあなたの友達です(awkも可能です)。このコードを使用できます(一致する各行にタイムラインがあると仮定)。

sed '$!N;/echo 2/!P;D' "$HISTFILE" > /tmp/history

または、履歴ファイルから直接実行します。

sed -i '$!N;/echo 2/!P;D' "$HISTFILE"

あなたの例は次のとおりです。

#1517681911
echo 1
#1517681931
echo 3

より制限的な一致:パターンの前の実際のタイムラインのみを削除します(フィールド#の後に10桁の行と一致)。

awk -vp="echo 2" ' {b=$0};b~p{next}
                   NF=1 && b~/#[0-9]{10}/{a=b;next}
                   {print(a RS b)}
                 ' "$HISTFILE"

関連情報