Bash,从两个模式之间的文件输出,但带有变量和星号

Bash,从两个模式之间的文件输出,但带有变量和星号

问题

我需要在文件中选择两个模式之间的所有内容,但带有变量和*通配符。

例子(类似这样)。

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

由于您想要输出多行文本块,我建议您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} $0 ~ 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"

答案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)

感谢大家的合作。

相关内容