Как удалить из скрипта строки в диапазоне, содержащие заданную строку?

$ sed -n '/XXX/,$ { /123/ { p; q; }; }' <file
123

Применяет команду pдля печати текущей строки, за которой следует команда qдля выхода, к строке, соответствующей 123. Тест для 123выполняется на всех строках между первой, совпадающей с XXX, и концом ввода (включительно ).

Для исключения строк XXX(123не должно находиться в той же строке, что и строка XXX):

$ sed -n '/XXX/,$ { /XXX/d; /123/ { p; q; }; }' <file
123
0
24.03.2020, 18:37
1 ответ

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

Вот оба рабочих скрипта, а также файлы ввода и вывода, которые запросил @guillermo chamorro, и пример вызова (Не уверен, правильно ли я использую здесь слово «вызов»; скажем, «используя» )скрипт из терминала:

файл1(файл2 имеет то же содержимое)

Out of the first 30 lines of this file I will be deleting only those that contain 
the character substring given as a parameter.
2
3
4
5
6
7
8
9
10
11
12    
13
14
15
16
17
18
19
30
31
32
33
...
and so on

функция _оболочка _1

#!/bin/bash
a=${@: -1} # store last argument in a variable

    #part of the for-loop line is commented because of the first hashtag character

for ((i=1; i<$#; i++)) # consider all arguments, but the last one
do
    sed -i "1,30{/$a/d}" "${!i}" 
    # for each i-th line among the first 30 lines, do in-place deletions 
    #(-i dictates the in-place part) of each one containing the value of the
    # a variable
done

функция _оболочка _2(незначительные изменения относительно цикла for -)

#!/bin/bash
a=${@: -1} # store last argument in a variable

for fisier in "${@:1:$# - 1}" # consider all arguments, but the last one
do
    sed -i "1,30{/$a/d}" $fisier         
    # for each i-th line among the first 30 lines, do in-place deletions 
    #(-i dictates the in-place part) of each one containing the value of the
    # a variable
done

пример команды скрипта:

./function_shell_1 file1 file2 '2'
#./function_shell_2 file1 file2 '2'

Оба вышеперечисленных метода работают одинаково, производя одни и те же ожидаемые изменения как в файле 1 , так и в файле 2 , т. е.:

Out of the first 30 lines of this file I will be deleting only those that contain
the character substring given as a parameter.
3
4
5
6
7
8
9
10
11
13
14
15
16
17
18
19
31
32
33
...
and so on
0
28.04.2021, 23:19

Теги

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