Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/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 如何搜索可能跨越或不跨越两行的字符串?_Bash_Search_Grep_Line_Cut - Fatal编程技术网

Bash 如何搜索可能跨越或不跨越两行的字符串?

Bash 如何搜索可能跨越或不跨越两行的字符串?,bash,search,grep,line,cut,Bash,Search,Grep,Line,Cut,所以我试图收集字符串后的一系列数字。但是,字符串在我正在排序的文本块中的位置可能会发生很大变化 以下是我目前正在使用的完整代码: echo name HF MP2 | cat > allE for i in *.out do grep "Slide" $i | cut -d "\\" -f2 | cat | tr -d '\n' > $i.name && grep "EUMP2" $i | cut -d "=" -f3 | cut -c 1-25

所以我试图收集字符串后的一系列数字。但是,字符串在我正在排序的文本块中的位置可能会发生很大变化

以下是我目前正在使用的完整代码:

echo name HF MP2 | cat > allE

for i in *.out
    do grep "Slide" $i | cut -d "\\" -f2 | cat | tr -d '\n' > $i.name && 
    grep "EUMP2" $i | cut -d "=" -f3 | cut -c 1-25 | tr '\n' ' ' >> $i.mp2 && 
    grep 'AG\\HF' $i | cut -d "=" -f3 | cut -c 1-13 | tr '\n' ' ' >> $i.hf && 
    paste $i.name >> $i.energies &&
    paste $i.hf >> $i.energies &&
    sed -i 's/[ABCEFGHIJKLMNOPQRSTUVWXYZ]//g' $i.mp2 &&
    paste $i.mp2 >> $i.energies &&
    transpose $i.energies >> $i.allE #temp.txt &&
    #cat temp.txt > $i.energies
    #echo $i is finished
done

echo see allE for energies

rm *.energies #temp.txt
rm *.name
rm *.mp2
我正在搜索的字符串是AG\HF。 问题是它正在搜索的数据可能看起来像(注意:此数据中有实际的新行字符,我认为这是造成问题的原因)

以及其他几种可能的组合。
目前,我使用grep和a=作为分隔符,这在60%的时间内都有效。 grep是这样写的:

grep 'AG\\HF' $i | cut -d "=" -f3 | cut -c 1-13 | tr '\n' ' ' >> $i.hf 
这个grep将在同一个文件中发生多次

如有任何建议能使所需13个字符的收集保持一致,我们将不胜感激

最终结果应该如下所示:

-461.4440942  -461.4441024  -461.4441114  -461.4441212  -461.4441321  -461.4441575  -461.4441725  -461.4441893  -461.444208  -461.4442289  -461.4442522  -461.444278  -461.4443063  -461.4443371  -461.4444054  -461.4444421  -461.4444798  -461.4445175  -461.4445544  -461.4445891
我实际得到的是期望输出和以下内容的组合:

-461.4417716\ -461.4413023\ 1-AG\HF -461.439848\M -461.4387568\ -461.4373225\ -461.4354367\ -461.4329522\ -461.4296709\ -461.4253285\ -461.419576\M -461.4119582\ 1-AG\HF -461.4432257\ -461.4431843\ -461.4431419\ -461.443098\M -461.4430519\ 1-AG\HF -461.4429461\ -461.4428799\ -461.4427974\ -461.4426902\ -461.4425469\ -461.4423525\ -461.4420882\ -461.4417302\ -461.4412489\ 1-AG\HF -461.439758\M -461.4386392\ -461.4371684\ -461.4352341\ -461.4326853\ -461.4293183\ -461.4248614\ -461.4189557\ -461.411132\M 1-AG\HF -461.4432226\ -461.443181\M -461.4431381\ -461.4430938\ -461.4430472\ 1-AG\HF -461.4429401\ -461.4428728\ -461.4427889\ -461.44268\MP -461.4425343\ -461.4423369\ -461.4420684\ -461.4417048\ -461.4412162\ 1-AG\HF -461.4397026\ -461.4385667\ -461.4370734\ -461.4351091\ -461.4325204\ -461.4291001\ -461.424572\M -461.4185707\ -461.4106184\ 1-AG\HF -461.4432215\ -461.4431798\ -461.4431369\ -461.4430924\ -461.4430457\ 1-AG\HF -461.442938\M -461.4428704\ -461.4427861\ -461.4426766\ -461.4425301\ -461.4423316\ -461.4420617\ -461.4416963\ -461.4412051\ 1-AG\HF -461.4396839\ -461.4385423\ -461.4370413\ -461.4350669\ -461.4324646\ -461.4290263\ -461.4244739\ -461.4184402\ -461.4104442\ 1-AG\HF 
使用线路

    awk -v ORS=' ' -F= '$3 ~ /AG\\HF$/{print substr($4, 1, 12)}' $i >> $i.hf && 
所有这些都是产出

                     -4 -4 -4 

您可以使用此单一的
awk

awk -F= '$3 ~ /AG\\HF$/{print substr($4, 1, 12)}' file

要在单行中获取输出,请执行以下操作:

awk -v ORS=' ' -F= '$3 ~ /AG\\HF$/{print substr($4, 1, 12)}' file

请为每个示例输入添加您的预期输出。您的实际输出是什么?它与预期输出有何不同?记录的长度是否相同?(即,是否可以以XXX个字符的块而不是行处理文件)。数据中是否总是有开始哨兵和结束哨兵?它们不总是相同的长度,感兴趣的值也不总是出现在同一行上。现在,每组数据(长度可变的行数)以
1\1\GINC
开头,以
\\@
@Yes结尾。我已经让脚本遍历并删除换行符,如果它正在分解所需的文本。然后我调用HF作为分隔符并收集字符。$3和$4的定义是什么?我对awk不太熟悉。不幸的是,这比我使用的原始grep命令的效果还要差。
$n
是awk中由
=
分隔的
n
字段
    awk -v ORS=' ' -F= '$3 ~ /AG\\HF$/{print substr($4, 1, 12)}' $i >> $i.hf && 
                     -4 -4 -4 
awk -F= '$3 ~ /AG\\HF$/{print substr($4, 1, 12)}' file
-461.3998608
-461.4104442
-461.4440942
-461.4441483
awk -v ORS=' ' -F= '$3 ~ /AG\\HF$/{print substr($4, 1, 12)}' file