删除包含$ A但不包含$ B的行格式文件

时间:2018-07-10 23:37:30

标签: bash sed

我想从文本文件中删除所有

  • 包含变量$ A
  • 但如果它也包含变量$ B
  • ,则不会

当前我有类似的东西:

def add_to_cart(request, product_id):   if request.method == 'POST':
    product = Product.objects.get(pk=product_id)
    product.in_cart = True
    product.save()
    return redirect('cart')

有没有更优雅的方式?这似乎并不总是可行(仍然需要弄清楚“不可行”的参数是什么)。

1 个答案:

答案 0 :(得分:0)

使用sed + grep进行当前尝试的更优雅的方法是仅使用awk:

awk -v a="$VAR_A_TO_BE_DELETED" -v b="$VAR_B_DONT_DELETE" '
    ($0 ~ b) || !($0 ~ a)
' "$FILE_NAME" > temp_file && 
mv temp_file "$FILE_NAME"

,并且,由于您有时说这不起作用,并猜测这是由于变量内容中的正则表达式元字符所致,因此正确的做法是使用字符串操作而不是正则表达式:

awk -v a="$VAR_A_TO_BE_DELETED" -v b="$VAR_B_DONT_DELETE" '
    index($0,b) || !index($0,a)
' "$FILE_NAME" > temp_file && 
mv temp_file "$FILE_NAME"

如果您的变量可以包含反斜杠,例如\t,然后以上内容将对其进行扩展,例如到制表符。如果存在问题,则可以在变量分配的每个反斜杠之前添加一个反斜杠,或者执行以下操作:

awk '
    BEGIN {
        a=ARGV[2]; ARGV[2]=""; ARGC--
        b=ARGV[3]; ARGV[3]=""; ARGC--
    }
    index($0,b) || !index($0,a)
' "$FILE_NAME" "$VAR_A_TO_BE_DELETED" "$VAR_B_DONT_DELETE" > temp_file && 
mv temp_file "$FILE_NAME"