удалить строки, содержащие точную строку в bash скрипте с помощью sed - PullRequest
1 голос
/ 25 марта 2020

Я пытаюсь запустить сценарий bash, который удаляет строки из файла только с указанной мной строкой c, которую я передаю, " / home / ken / sed.txt ».

Текущий скрипт, который ничего не делает:

#!/bin/bash

script="\\/home\\/ken\\/sed.txt"

sed -i "/\<$script\>/d" /home/ken/sed.txt

Это удаляет все строки:

#!/bin/bash

script="\\/home\\/ken\\/sed.txt"

sed -i "/$script/d" /home/ken/sed.txt

Файл:

1 1 1 1 1 /home/ken/sed.txt
6 6 6 6 6 /home/ken/sed.txt
2 2 2 2 2 /home/ken/sed.txt
6 6 6 6 6 /home/ken/sed.txt
3 3 3 3 3 /home/ken/sed.txt
3 3 3 3 3 /home/ken/sed.txt
5 5 5 5 5 /home/ken/sed.txt
1 1 1 1 1 a/home/ken/sed.txt
6 6 6 6 6 a/home/ken/sed.txt
2 2 2 2 2 a/home/ken/sed.txt
6 6 6 6 6 a/home/ken/sed.txt
3 3 3 3 3 a/home/ken/sed.txt
3 3 3 3 3 a/home/ken/sed.txt
5 5 5 5 5 a/home/ken/sed.txt

Желаемый результат:

1 1 1 1 1 a/home/ken/sed.txt
6 6 6 6 6 a/home/ken/sed.txt
2 2 2 2 2 a/home/ken/sed.txt
6 6 6 6 6 a/home/ken/sed.txt
3 3 3 3 3 a/home/ken/sed.txt
3 3 3 3 3 a/home/ken/sed.txt
5 5 5 5 5 a/home/ken/sed.txt

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

4 голосов
/ 25 марта 2020
script='/home/ken/sed.txt'
sed -n "\|\b$script|p" file

Выход:

1 1 1 1 1 a/home/ken/sed.txt
6 6 6 6 6 a/home/ken/sed.txt
2 2 2 2 2 a/home/ken/sed.txt
6 6 6 6 6 a/home/ken/sed.txt
3 3 3 3 3 a/home/ken/sed.txt
3 3 3 3 3 a/home/ken/sed.txt
5 5 5 5 5 a/home/ken/sed.txt

Я переключился с // p на \||p, чтобы избежать экранирования /.

С man sed:

\cregexpc: сопоставить строки, соответствующие регулярному выражению регулярного выражения. c может быть любым символом.

См .: \ b

1 голос
/ 25 марта 2020

Как обычно, когда требуется отредактировать файл на месте, я рекомендую ed сверх sed -i:

#!/bin/sh
script=" /home/ken/sed.txt"
ed -s sed.txt <<EOF
g!$script!d
w
EOF

Обратите внимание на добавление пробела в переменную $script, чтобы избежать совпадения с a/home/ken/sed.txt строк. Без этого каждая строка в вашем примере файла будет удалена, как вы видели.

0 голосов
/ 25 марта 2020

Зачем нужен sed? Я думаю, что вы могли бы просто выполнить команду "--fixed-strings" и "--invert-match":

$ fgrep -v ' /home/ken/sed.txt' file.txt
1 1 1 1 1 a/home/ken/sed.txt
6 6 6 6 6 a/home/ken/sed.txt
2 2 2 2 2 a/home/ken/sed.txt
6 6 6 6 6 a/home/ken/sed.txt
3 3 3 3 3 a/home/ken/sed.txt
3 3 3 3 3 a/home/ken/sed.txt
5 5 5 5 5 a/home/ken/sed.txt

grep -F -v ' /home/ken/sed.txt' file.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...