$ 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
Моя проблема заключалась в том, что я использовал не двойные -кавычки, а одинарные -кавычки; поэтому переменное расширение было невозможно.
Вот оба рабочих скрипта, а также файлы ввода и вывода, которые запросил @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