我想删除与某个字符串匹配的所有历史条目。我发现 这个方法:
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
一种更具限制性的匹配:仅删除模式之前的实际时间线(匹配具有一个字段为 # 后跟十位数字的行)
awk -vp="echo 2" ' {b=$0};b~p{next}
NF=1 && b~/#[0-9]{10}/{a=b;next}
{print(a RS b)}
' "$HISTFILE"