Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 我想写一个shell脚本,在这个脚本中,我可以从多个文件中剪切一个特定的子字符串,并将其写入文本文件_Bash_Shell_Sh - Fatal编程技术网

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 567
cd/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 567
cd/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后面的三个字符,再在另一个捕获组中匹配下三个字符,然后替换为第一个捕获组、一个空格和第二个捕获组的内容