Issue
Мне нужно выбрать все два шаблона в файле, но с переменными и с *
в качестве подстановочных знаков.
Пример (что-то в этом роде).
myscript var1 var2 var3
Скрипт.
#!/bin/bash
cat $1 | sed -n "/*$2*$3/,/## end of string ##/p"
Это не работает, как я ожидаю, потому что *
не получается как anything
. *
должно быть что-то между переменными. Пример файла ($1
), например, такой.
## First line, first variable is var2, and second variable is var3. Information text.
Some text
to display.
## end of string ##
Я чист? Спасибо.
Система
Linux local 5.0.0-29-lowlatency #31-Ubuntu SMP PREEMPT Thu Sep 12 14:13:01 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
Редактировать
Например, здесь находится входной файл in.txt
.
## bash, file, csv, show duplicate lines by column, uniq -d is don't repeat
cut -d'|' -f1,2,3 dbdump.csv | sort -k3 -t'|' | uniq -D
cut -d '|' -f 1,2,3,4,5,6 dbdump.csv | uniq -d | grep -Ff - dbdump.csv
## bash, folders, rename string in directory name
find -name "* *" -type d | rename 's/ /_/g'
## bash, files, remove all files instead *.jpg (or mp4)
find . -type f -not -name '*.jpg' -delete
rm -v !(*.jpg|*.mp4)
## bash, files, find files and multiple rename
find ./ -type f -readable -writable -exec sed -i "s/OLD/NEW/g" {} \;
Код сценария myscript.sh
здесь.
#!/bin/bash
cat $1 | sed -n "/*$2*$3*$4/,/##/p"
Пример использования myscript.sh
.
myscript.sh in.txt bash file rem
Вывод из скрипта должен быть таким (получить файл, отобразить вывод из строки pattern1 - где $ 2 (bash), $ 3 (файл) и $ 4 (rem) на одной строке, разделенные на что угодно, просто something $2 something $3 something $4 something
, для pattern2 ## end of string ##
. Так что только это.
## bash, files, remove all files instead *.jpg (or mp4)
find . -type f -not -name '*.jpg' -delete
rm -v !(*.jpg|*.mp4)
В конце это работает.
Сценарий myscript.sh
.
sed -n '/## '$1'.* '$2'.* '$3'/,/^$/p' in.txt
^$
, для удаления последней строки цикла.
Пример использования.
myscript.sh bash fil rem
Вывод (точно, в чем я нуждаюсь).
## bash, files, remove string from all files
for file in *; do mv "${file}" "${file/000/}"; done
## bash, files, remove all files from folder except defined
find [path] -type f -not -name 'textfile.txt' -not -name 'backup.tar.gz' -delete
## bash, files, remove all files instead *.jpg (or mp4)
find . -type f -not -name '*.jpg' -delete
rm -v !(*.jpg|*.mp4)
Благодаря всем для сотрудничества.
Так как Вы хотите произвести многострочные блоки текста, я предложил бы awk
, а не sed
, Например:
#!/bin/bash
infile="$1"
shift
# construct a regular expression string from the remaining positional parameters
printf -v re -- '.*%s' "$@"
# NB unexpected things may happen if parameters contain regex-special characters
awk -v re="$re" '/##/ {p=0} [110] ~ re {p=1} p' "$infile"
, Если Ваш вход действительно разделяется на очерченные пробелом блоки, это могло бы быть более чисто для использования awk в режим абзаца , рассматривая каждую строку как поле:
#!/bin/bash
infile="$1"
shift
# construct a regular expression string from the remaining positional parameters
printf -v re -- '.*%s' "$@"
# NB unexpected things may happen if parameters contain regex-special characters
awk -v RS= -v re="$re" -F'\n' '$1 ~ re' "$infile"