![Bash,从两个模式之间的文件输出,但带有变量和星号](https://linux22.com/image/916440/Bash%EF%BC%8C%E4%BB%8E%E4%B8%A4%E4%B8%AA%E6%A8%A1%E5%BC%8F%E4%B9%8B%E9%97%B4%E7%9A%84%E6%96%87%E4%BB%B6%E8%BE%93%E5%87%BA%EF%BC%8C%E4%BD%86%E5%B8%A6%E6%9C%89%E5%8F%98%E9%87%8F%E5%92%8C%E6%98%9F%E5%8F%B7.png)
问题
我需要在文件中选择两个模式之间的所有内容,但带有变量和*
通配符。
例子(类似这样)。
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)
感谢大家的合作。