Sed для удаления строки с точным шаблоном

Если вы хотите сделать это с помощью скрипта Python:

#!/usr/bin/env python
##
# use: ingest.py infile1 infile2... infilen

import math,re,argparse

parser = argparse.ArgumentParser()
parser.add_argument('infiles', type=str, help='infile names', nargs='+')
args = parser.parse_args()

for infile in args.infiles:
    with open(infile) as in_file, open(infile+".out", "w+") as out_file:
        column_names = in_file.readline().split()
        out_file.write("N (k/(s/300.0000)) Abs(S)/E exp(Abs(S)/E)\n")
        for line in in_file.readlines():
            column_values = [float(x) for x in line.split()]
            value_dict = dict(zip(column_names,column_values))
            div = value_dict["k"]/(value_dict["s"]/300.0000)
            ABS = abs(value_dict["S"])/value_dict["E"]
            EXP = math.exp(abs(value_dict["S"])/value_dict["E"])
            out_file.write("{N} {DIV} {ABS} {EXP}\n".format(N=value_dict["N"],DIV=div,ABS=ABS, EXP=EXP))
0
01.02.2020, 14:42
2 ответа

Причина, по которой вы получаете сообщение об ошибке, заключается в том, что ваша строка поиска содержит символы /, которые перепутаны с символами-маркерами. Другими словами, вы просите sedсделать это:

sed "//home/mytest/datasr123/d"

, что приводит к ошибке, которую вы видели. IOW, шаблон не может содержать символ, который вы используете в качестве маркера. Если вы знаете, что ваш шаблон не содержит данного символа, вы можете использовать этот символ в качестве маркера; например. поскольку в вашей строке поиска нет ;, вы можете сделать это:

sed "\;/home/mytest/datasr123;d"

или в терминах$i:

sed "\;$i;d"

См. справочную страницу sedв разделе Addressesдля получения подробной информации о том, как указывать адреса.

Конечно, полезность этого зависит от того, знаете ли вы символ, который никогда не будет встречаться в ваших строках поиска. :Любой символ подойдет в качестве маркера, но если ваша строка поиска вводится пользователем, есть нет гарантий, что то, что вы выберете, не встретится в строке поиска -, вам придется просмотреть ее, чтобы найти символ, который в ней не встречается.

И самый простой способ — вообще не использовать sed,но вернитесь к grep (с благодарностью @Kusalananda за исправление моих ошибок с костями -во главе):

grep -v -F -e "$i" -- <file>

покажет только те строки, которые не соответствуют шаблону (это-v--Fуказывает grep интерпретировать строку буквально, а не как регулярное выражение, так что, например, *и .совпадают буквально; -eпозволяет шаблону начинаться с -и не интерпретироваться как опция grep; а --позволяет имени файла начинаться с -и не интерпретироваться как опция grep; последние два всегда хорошо иметь в grepвызове внутри скрипта, так как вы никогда не знаете, когда может возникнуть такая ситуация, хотя обычно нам это сходит с рук, когда grepвызывается интерактивно ).

НО N.B. :Вопрос был отредактирован, и изменение шаблона полностью аннулировало каждый метод в этом ответе. Шаблон соответствует обеим строкам во входных данных, поэтому обе они будут удалены. Вам придется как-то переосмыслить шаблон, например. не ищите "$i", так как это будет соответствовать обоим; вместо этого ищите "${i} ", где дополнительный пробел будет соответствовать первой строке, но не второй, или "${i}s", чтобы соответствовать второй строке, но не первой. Также обратите внимание, что с -Fвы не можете использовать классы символов (, поэтому \bотсутствует ).

2
28.04.2021, 23:24

Оригинал grep -iwoP, похоже, не отражает идею «точного совпадения»... однако

Чтобы удалить целые строки, точно соответствующие строке поиска, необходимо привязать ее к началу ^и концу $строки.

sed "\|^$i$|d" C1.txt
0
28.04.2021, 23:24

Теги

Похожие вопросы