Удалить слово с соответствием, но сохранить оригинальное слово как таковое в файле - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь добиться следующего:

Есть файл, в котором есть несколько слов, например:

Выходные данные txt

testStr
testmystring
testmystring_1
testmystringwq
testStr_3
testStrasd
testStr-345
testStr1
testingStr1

Теперь я пытаюсь добиться того, чтобы, если я оперирую с файлом построчно, т. Е. С помощью testStr в первый раз, тогда все слова, начинающиеся с testStr, должны быть удалены, но здесь testStr должен оставаться, т. Е.

Ожидаемый результат -

testStr
testmystring
testmystring_1
testmystringwq
testingStr1

Теперь следует сравнить следующую строку из файла, т. Е. Testmystring. Тогда ожидаемый результат составит

testStr
testmystring
testingStr1

И так далее ...

Я попытался использовать команду sed для удаления с использованием шаблона, и это работает. Но мне нужно, чтобы оригинальный файл оставался в файле.

sed -i '/testStr*/d' ./sample txt 

Ответы [ 3 ]

1 голос
/ 07 июня 2019

Это может работать для вас (GNU sed):

sed 's/\<\(testStr\)\S*/\1/;H;$!d;x;s/.//;:a;s/\<\(\(testStr\n\).*\)\2/\1/;ta' file

Удалить все символы, следующие за строкой testStr.Сохраните результаты и неизмененные строки в трюме.В конце файла удалите введенную новую строку, а затем удалите все, кроме первого вхождения строки testStr.

NB. Более простое решение может быть:

sed 's/\<\(testStr\)\S*/\1/' file | sort -u

Однако этоудалит дубликаты строк, отличные от testStr, а также может изменить исходный порядок.

РЕДАКТИРОВАТЬ: Чтобы учесть изменения исходного вопроса, предоставляются два файла.Первый исходный файл содержит строки для проверки (file) и новый второй файл, содержащий только те строки (fileInput) для сопоставления.

Используя приведенное выше решение и чередование, создайте сценарий из fileInput:

sed 'H;$!d;x;s/.//;s/\n/|/g;s#.*#s/\\<(&)\\S*/\\1/;H;$!d;x;s/.//;:a;s/\\<(((&)\\n).*)\\2/\\1/;ta#' fileInput |
sed -Ef - file
0 голосов
/ 07 июня 2019

Вот как сделать то, что вы просили, с буквенными строками:

$ awk 'NR==FNR{tgts[$0]; next} {for (tgt in tgts) if (($0 != tgt) && (index($0,tgt) == 1)) next} 1' targets file
testStr
testmystring
testingStr1

Выше были выполнены следующие входные файлы:

$ tail -n +0 targets file
==> targets <==
testStr
testmystring

==> file <==
testStr
testmystring
testmystring_1
testmystringwq
testStr_3
testStrasd
testStr-345
testStr1
testingStr1

Вышеуказанное будет работать независимо от того, какие символы находятся в обоих файлах.

0 голосов
/ 07 июня 2019

Как насчет этого?

$ grep -Evf <(sed 's/^/^/; s/$/.+/' sample.txt) sample.txt
testStr
testmystring
testingStr1

(Требуется bash, zsh, ksh93 или другая оболочка, которая понимает перенаправление стиля <(command).)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...