从文本文件中逐行读取并打印我想要的Shell脚本

时间:2018-11-15 08:57:14

标签: shell

我想从文本文件中逐行读取下面的文件,并在shell脚本中打印所需的内容

Text file content:   
zero#123456  
one#123  
two#12345678 

我要将其打印为:

zero@1-6  
one@1-3  
two@1-8  

我尝试了以下操作:

file="readFile.txt"     
while IFS= read -r line    
do echo  "$line"     
done  <printf '%s\n' "$file"    

3 个答案:

答案 0 :(得分:1)

创建如下脚本:my_print.sh

file="readFile.txt" 

while IFS= read -r line
do
one=$(echo $line| awk -F'#' '{print $1}') ## This splits the line based on '#' and picks the 1st value. So, we get zero from 'zero#123456 ' 
len=$(echo $line| awk -F'#' '{print $2}'|wc -c)  ## This takes the 2nd value which is 123456 and counts the number of characters
two=$(echo $line| awk -F'#' '{print $2}'| cut -c 1)  ## This picks the 1st character from '123456' which is 1
three=$(echo $line| awk -F'#' '{print $2}'| cut -c $((len-1)))  ## This picks the last character from '123456' which is 6
echo $one@$two-$three  ## This is basically printing the output in the format you wanted 'zero@1-6'
done <"$file"

运行方式:

mayankp@mayank:~/$ sh my_print.sh 
mayankp@mayank:~/$ cat output.txt 
zero@1-6
one@1-3
two@1-8

让我知道这会有所帮助。

答案 1 :(得分:1)

使用sed:

sed -r 's/^(.+)#([0-9])[0-9]*([0-9])\s*$/\1@\2-\3/' readFile.txt
  • -r:使用扩展的正则表达式(只是编写某些内容而不会用反斜杠将其转义)
  • s/expr1/expr2/ :由expr1 s ubstitute expr2
  • epxr1 由正则表达式描述,相关的匹配模式由3个捕获组(带括号的捕获组)捕获。
  • epxr2 检索捕获的字符串(\1\2\3)并将其插入格式化输出中(您想要的一个) 。

Regular-Expressions.info从它们开始似乎很有趣。您也可以使用Regx101.com检查自己的正则表达式。

更新:您也可以使用awk做到这一点:

awk -F'#' '{ \
             gsub(/\s*/,"", $2) ; \
             print $1 "@" substr($2, 1, 1) "-" substr($2, length($2), 1) \
           }' < test.txt

我添加了一个gsub()呼叫,因为您的文件似乎包含尾随的空白字符。

答案 2 :(得分:1)

这不是shell脚本(首先错过了,对不起),而是使用结合了lookahead和lookbehind的perl来获取数字:

$ perl -pe 's/(?<=[0-9]).*(?=[0-9])/-/' file
Text file content:   
zero#1-6  
one#1-3  
two#1-8 

解释了一些:

  • s//-/替换为-
  • (?<=[0-9])后面是肯定的符号,如果前面有数字
  • (?=[0-9])正向查找,如果后跟数字