【问题标题】:I want to write a shell script in which I can cut a particular substring from multiple files and write it into text file我想编写一个 shell 脚本,我可以在其中从多个文件中剪切一个特定的子字符串并将其写入文本文件
【发布时间】:2019-08-30 14:48:07
【问题描述】:

这些是文本文件:

f1.txt:

TXT123456798
TRB0987906554
TXTxzcxczxzcxzc

f2.txt:

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

【问题讨论】:

  • 预期输出中的newfile.txt 来自哪里?我假设f1.txt/f2.txt 是您描述为输入的file1.txt 和file2.txt,这是正确的吗?
  • 因为我想将输出保存在新文件中
  • 标签说 Bash sh,shebang说/bin/sh,代码有bashisms。是哪个?
  • 适用于linux

标签: bash shell sh


【解决方案1】:

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

你可以try it here

【讨论】:

  • 如果我需要从 10 到 20 的子字符串,我必须在这个正则表达式中做些什么
  • @Vishal 我不确定您的意思,您能否在示例输入/输出中反映这一点?
  • 如果我需要这样的输出:- file1.txt 567
  • cd /home/pverm84/folder1/; grep -H TXT * | sed -E 's/:TXT.{4}(.{3}).*/ \1/' 也许? ideone.com/bsrjeU
  • 当然,将 sed 命令更改为 's/:TXT(.{3}).(.{3}).*/ \1 \2/'。 sed 的替换命令的基本语法是s/search/replaceBy/,如果你在搜索部分使用括号,你可以在replaceBy 部分引用它们的内容;这里我匹配一个捕获组中TXT之后的三个字符,匹配另一个,然后匹配第二个捕获组中的下三个字符,然后我替换为第一个捕获组的内容,一个空格和第二个捕获组
猜你喜欢
  • 2015-05-08
  • 2021-04-24
  • 1970-01-01
  • 2020-09-14
  • 2011-11-18
  • 2013-04-09
  • 2018-06-27
  • 2022-01-14
  • 2017-12-29
相关资源
最近更新 更多