특정 문자열과 일치하는 모든 기록 항목을 삭제하고 싶습니다. 내가 찾은 이 방법:
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"