Bash, вывод из файла между 2 шаблонами, но с переменными и звездочками

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)
-1
задан 1 October 2019 в 16:35

2 ответа

В конце это работает.

Сценарий 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)

Благодаря всем для сотрудничества.

0
ответ дан 23 October 2019 в 09:45

Так как Вы хотите произвести многострочные блоки текста, я предложил бы 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"
1
ответ дан 23 October 2019 в 09:45

Другие вопросы по тегам:

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