我想从文本文件中逐行读取下面的文件,并在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"
答案 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])
正向查找,如果后跟数字