Shell 脚本:如何从文件的每一行中选取表达式的值

发布于 2024-10-05 13:12:50 字数 521 浏览 2 评论 0原文

我是 shell 脚本新手。

我有一个包含以下形式的一些记录的文件:

“text1:text2 = value2,text3 = value3,text4 = value4,text5 = value5”text1:text6:value6” “文本1:文本2 =值2,文本3 =值3,文本4 =值4,文本5 =值5”文本1:文本6:值6” “文本1:文本2 =值2,文本3 =值3,文本4 =值4,文本5 =值5”文本1:文本6:值6” "text1:text2=value2,text3=value3,text4=value4,text5=value5"text1:text6:value6"

现在我想编写一个 shell 脚本来获取某些文本的值字段。 例如: 我想要 value2 和 value5 并且我知道它们将存在于 text2= 和 text5= 前面

并且完整的行中没有空格。该文件包含 n 行,我希望每行有 2 个值(即 value2 和 value5),然后存储在变量中以供进一步处理。

有人可以帮忙吗。

谢谢

I am new with shell scripting.

I am having a file containing some records of the form:

"text1:text2=value2,text3=value3,text4=value4,text5=value5"text1:text6:value6"
"text1:text2=value2,text3=value3,text4=value4,text5=value5"text1:text6:value6"
"text1:text2=value2,text3=value3,text4=value4,text5=value5"text1:text6:value6"
"text1:text2=value2,text3=value3,text4=value4,text5=value5"text1:text6:value6"

Now I want to write a shell script that picks up the value field for some text.
Eg:
I want value2 and value5 and I know that they will exist in front of text2= and text5=

Also there is no blank space in complete line. The file contains n lines and I want to have 2 values from each line(ie value2 and value5) and store then in a variables for further processing.

Can someone help.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

喜爱纠缠 2024-10-12 13:12:51

使用 sed

while read text2var text5var
do
    #something with text2var and text5var
done < sed 's/.*:text2=\([^,]*\),.*,text5=\([^"]*\)".*/\1 \2/') inputfile

使用 GNU AWK (gawk):

while read text2var text5var
do
    #something with text2var and text5var
done < gawk -F ',|:|"' '{sub("[^=]*=","",$3); sub("[^=]*=","",$6); print $3, $6}' inputfile

要使用没有正则表达式作为字段分隔符的其他 AWK 版本,请使用类似于 的正则表达式sed 命令或使用大量分割:

while read text2var text5var
do
    #something with text2var and text5var
done < awk -F ',' '{split($1,t2,"text2="); split($4,t5,"\""); split(t5[1],t5,"="); print t2[2], t5[2]}' inputfile

使用 cut

while read text2var text5var
do
    #something with text2var and text5var
done < cut -d , -f 1,4 --output-delimiter='=' inputfile | cut -d '"' -f2 | cut -d = -f1,3 | cut -d : -f 2 | cut -d = --output-delimiter=' ' -f1,2 

GNU cut 可能需要能够使用 --output-delimiter< /代码> 选项。它可能很难看,但至少不会每行都被调用四次。

Using sed:

while read text2var text5var
do
    #something with text2var and text5var
done < sed 's/.*:text2=\([^,]*\),.*,text5=\([^"]*\)".*/\1 \2/') inputfile

Using GNU AWK (gawk):

while read text2var text5var
do
    #something with text2var and text5var
done < gawk -F ',|:|"' '{sub("[^=]*=","",$3); sub("[^=]*=","",$6); print $3, $6}' inputfile

To use other versions of AWK that don't have regular expressions for field separators, use a regex similar to the sed command or use a lot of splitting:

while read text2var text5var
do
    #something with text2var and text5var
done < awk -F ',' '{split($1,t2,"text2="); split($4,t5,"\""); split(t5[1],t5,"="); print t2[2], t5[2]}' inputfile

Using cut:

while read text2var text5var
do
    #something with text2var and text5var
done < cut -d , -f 1,4 --output-delimiter='=' inputfile | cut -d '"' -f2 | cut -d = -f1,3 | cut -d : -f 2 | cut -d = --output-delimiter=' ' -f1,2 

GNU cut may be required to be able to use the --output-delimiter option. It may be ugly but at least it's not being called four times on every line.

亽野灬性zι浪 2024-10-12 13:12:51

我确信一些更优雅的解决方案是可能的,但这个 bash 脚本只是循环输入并过滤掉

  • 之间的值。
  • 第一个 = 和后面的 和< p>第四个=和后面的"之间的值:

    读取行时
    做
        value2=`echo "$line" | 值2=`echo "$line" |切-d = -f 2 |切 -d , -f 1`
        value5=`回显“$line”|切-d = -f 5 |切-d \" -f 1`
        echo $value2 - $value5 # 用 $value2 和 $value5 做一些事情
    完毕
    

您可以像这样调用脚本:

bash myscript.sh < mytextfile.txt

I'm sure that some more elegant solution is possible, but this bash script just loops through the input and filters out

  • the value between the first = and the following , and
  • the value between the fourth = and the following ":

    while read line
    do
        value2=`echo "$line" | cut -d = -f 2 | cut -d , -f 1`
        value5=`echo "$line" | cut -d = -f 5 | cut -d \" -f 1`
        echo $value2 - $value5   # do something with $value2 and $value5
    done
    

You call the script like this:

bash myscript.sh < mytextfile.txt
叫思念不要吵 2024-10-12 13:12:51

从命令行中使用 q.text 中的文本:

gawk -F\" '{print $2}' < q.txt | gawk -F: '{print $2 }' | gawk -F, '{print $1 "=" $4}'| gawk -F= '{print $2 "," $4}'

在 Cygwin bash 上尝试过,它会起作用。我不是程序员,但我使用 cygwin shell,并且认为尝试使用 gawk 执行此操作会很有趣。 。

From the Command Line with text in q.text:

gawk -F\" '{print $2}' < q.txt | gawk -F: '{print $2 }' | gawk -F, '{print $1 "=" $4}'| gawk -F= '{print $2 "," $4}'

Tried on Cygwin bash and it will work. I am not a programmer but I use the cygwin shell and thought it would be fun to try doing this with gawk.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文