Bash 我想写一个shell脚本,在这个脚本中,我可以从多个文件中剪切一个特定的子字符串,并将其写入文本文件
以下是文本文件:Bash 我想写一个shell脚本,在这个脚本中,我可以从多个文件中剪切一个特定的子字符串,并将其写入文本文件,bash,shell,sh,Bash,Shell,Sh,以下是文本文件: f1.txt: TXT123456798 TRB0987906554 TXTxzcxczxzcxzc TXT999999999 TAB888888888 TXT777777777 f2.txt: TXT123456798 TRB0987906554 TXTxzcxczxzcxzc TXT999999999 TAB888888888 TXT777777777 Grep TXT从多个文件中删除,并用文件名逐个写入每个剪切子字符串 我已经尝试了以下代码: #!/bin
f1.txt
:
TXT123456798
TRB0987906554
TXTxzcxczxzcxzc
TXT999999999
TAB888888888
TXT777777777
f2.txt
:
TXT123456798
TRB0987906554
TXTxzcxczxzcxzc
TXT999999999
TAB888888888
TXT777777777
Grep TXT从多个文件中删除,并用文件名逐个写入每个剪切子字符串
我已经尝试了以下代码:
#!/bin/sh
reports_count=`find /home/pverm84/folder1 -cmin -360 | grep txt | wc -l`
reports=($(find /home/pverm84/folder1 -cmin -360 | grep txt))
seq=0
while [ $seq -lt $reports_count ]
do
echo
CAP_reportName=${reports[$seq]}
echo File Name is $CAP_reportName
tbt= grep TXT $CAP_reportName | cut -c 4-6
File1=$(basename $CAP_reportName)
count=$tbt$File1
echo $count
seq=`expr $seq + 1`
done
电流输出:
File name is /home/pverm84/folder1/f2.txt
999
777
f2.txt
File name is /home/pverm84/folder1/f1.txt
123
xzc
f1.txt
newfile.txt
f1.txt 123
f1.txt xzc
f2.txt 999
f2.txt 777
例外输出:
File name is /home/pverm84/folder1/f2.txt
999
777
f2.txt
File name is /home/pverm84/folder1/f1.txt
123
xzc
f1.txt
newfile.txt
f1.txt 123
f1.txt xzc
f2.txt 999
f2.txt 777
带有
-H
标志的grep
输出您想要的信息,只是格式不正确:
$ grep -H TXT /home/pverm84/folder1/*
/home/pverm84/folder1/file1.txt:TXT123456798
/home/pverm84/folder1/file1.txt:TXTxzcxczxzcxzc
/home/pverm84/folder1/file2.txt:TXT999999999
/home/pverm84/folder1/file2.txt:TXT777777777
我们可以使用sed
重新格式化这些行:
$ grep -H TXT /home/pverm84/folder1/* | sed -E 's/:TXT(.{3}).*/ \1/'
/home/pverm84/folder1/file1.txt 123
/home/pverm84/folder1/file1.txt xzc
/home/pverm84/folder1/file2.txt 999
/home/pverm84/folder1/file2.txt 777
该sed
命令与grep
的输出中的:TXTXXX…
匹配,并用XXX
替换它
可以从目标目录运行该命令以避免绝对路径:
$ cd /home/pverm84/folder1/; grep -H TXT * | sed -E 's/:TXT(.{3}).*/ \1/'
file1.txt 123
file1.txt xzc
file2.txt 999
file2.txt 777
您可以。
grep
使用-H
标志输出您想要的信息,只是格式不正确:
$ grep -H TXT /home/pverm84/folder1/*
/home/pverm84/folder1/file1.txt:TXT123456798
/home/pverm84/folder1/file1.txt:TXTxzcxczxzcxzc
/home/pverm84/folder1/file2.txt:TXT999999999
/home/pverm84/folder1/file2.txt:TXT777777777
我们可以使用sed
重新格式化这些行:
$ grep -H TXT /home/pverm84/folder1/* | sed -E 's/:TXT(.{3}).*/ \1/'
/home/pverm84/folder1/file1.txt 123
/home/pverm84/folder1/file1.txt xzc
/home/pverm84/folder1/file2.txt 999
/home/pverm84/folder1/file2.txt 777
该sed
命令与grep
的输出中的:TXTXXX…
匹配,并用XXX
替换它
可以从目标目录运行该命令以避免绝对路径:
$ cd /home/pverm84/folder1/; grep -H TXT * | sed -E 's/:TXT(.{3}).*/ \1/'
file1.txt 123
file1.txt xzc
file2.txt 999
file2.txt 777
您可以。预期输出中的
newfile.txt
来自哪里?我假设f1.txt
/f2.txt
是您描述为输入的file1.txt和file2.txt,这是正确的吗?因为我想保存输出的新文件标签,比如Bash和sh,shebang说/bin/sh
,代码有bashisms。它是哪一个?它是用于Linux的newfile.txt
在预期输出中来自哪里?我假设f1.txt
/f2.txt
是您描述为输入的file1.txt和file2.txt,这是正确的吗?因为我想保存输出的新文件标签,比如Bash和sh,shebang说/bin/sh
,代码有bashisms。这是哪一个?这是给Linux的,如果我需要10到20的子串,那么我必须在这里做什么regex@Vishal我不知道你的意思,你能在你的输入/输出示例中反映出来吗?就像我需要这样的输出:-file1.txt 567cd/home/pverm84/folder1/;grep-htxt*| sed-E的/:TXT.{4}(.{3})。*/\1/'
也许吧?当然,将sed命令更改为's/:TXT(.{3})。(.{3})。*/\1\2/'
。sed的substitution命令的基本语法是s/search/replaceBy/
,如果在搜索部分中使用括号,则可以在replaceBy部分中引用其内容;在这里,我在一个捕获组中匹配TXT后的三个字符,再在另一个捕获组中匹配下三个字符,然后我用第一个捕获组的内容、一个空格和第二个捕获组的内容替换,如果我需要从10到20的子字符串,我必须在这里做什么regex@Vishal我不知道你是什么意思,您能在示例输入/输出中反映出来吗?就像我需要这样的输出:-file1.txt 567cd/home/pverm84/folder1/;grep-htxt*| sed-E的/:TXT.{4}(.{3})。*/\1/'
也许吧?当然,将sed命令更改为's/:TXT(.{3})。(.{3})。*/\1\2/'
。sed的substitution命令的基本语法是s/search/replaceBy/
,如果在搜索部分中使用括号,则可以在replaceBy部分中引用其内容;在这里,我在一个捕获组中匹配TXT后面的三个字符,再在另一个捕获组中匹配下三个字符,然后替换为第一个捕获组、一个空格和第二个捕获组的内容