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