首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在bash文件中更新多delimited分隔字段?

如何在bash文件中更新多delimited分隔字段?
EN

Stack Overflow用户
提问于 2022-01-06 15:10:31
回答 4查看 77关注 0票数 3

我试图匹配某个字段,并从一个由多个字符分隔的文件中更新其数据。我使用它创建了一个SQL更新的仿制品。这是创建一个带有bash的小型DBMS的更大项目的一部分。

我尝试了什么:

代码语言:javascript
复制
sed "s/\^\_\^/:/g" $file_path | cut -d: -f1 | grep -nw SAR | sed "s/\^\_\^/:/g" | cut -d: -f2 | sed -i "s/$match/$update/g"

我的问题是,我无法使用sed -i只更新这些特定的列,因为您无法进入它。

使用的分隔符是:^_^

数据文件示例:

代码语言:javascript
复制
'EGP'^_^'Egypt'
'SAR'^_^'Europe'
'SAR'^_^'Europe'
'SAR'^_^'Europe'
'SAR'^_^'Europe'
'Europe'^_^'SAR'
'SAR'^_^'Europe'
'MYR'^_^'Malaysia'
'MYR'^_^'Malasia'

例如,我的$match可以是SAR$update可以是USD

预期对数据文件的更改

代码语言:javascript
复制
'EGP'^_^'Egypt'
'USD'^_^'Europe'
'USD'^_^'Europe'
'USD'^_^'Europe'
'USD'^_^'Europe'
'Europe'^_^'SAR'
'USD'^_^'Europe'
'MYR'^_^'Malaysia'
'MYR'^_^'Malasia'

如果有另一种更好的方法,这也是值得欢迎的,因为我对bash脚本相当陌生。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-01-06 15:20:14

最好在这里使用awk

代码语言:javascript
复制
awk -v s="'SAR'" -v q="'USD'" -F'\\^_\\^' -v OFS='^_^' '$1==s {$1=q} 1' file

'EGP'^_^'Egypt'
'USD'^_^'Europe'
'USD'^_^'Europe'
'USD'^_^'Europe'
'USD'^_^'Europe'
'Europe'^_^'SAR'
'USD'^_^'Europe'
'MYR'^_^'Malaysia'
'MYR'^_^'Malasia'

解释:

  • -v s="'SAR'"设置命令行变量s='SAR'
  • -v q="'USD'"设置命令行变量s='USD'
  • -F '\\^_\\^'将输入字段分隔符设置为^_^。我们需要转义^,因为这是一个特殊的regexp字符,我们需要双转义它,因为我们在一个字符串中使用它,该字符串后来被转换为regexp(字段分隔符)。
  • -v OFS='^_^'将输出字段分隔符设置为^_^
  • $1 == s将第一个字段与'SAR'进行比较
  • $1 = q$1设置为变量'USD'
票数 4
EN

Stack Overflow用户

发布于 2022-01-06 15:34:28

使用sed,您可以在字符串$match的开头使用^,并使用$update更改它。

代码语言:javascript
复制
match="'SAR'"
update="'USD'"
sed "s/^$match\^_\^/$update^_^/" file

输出

代码语言:javascript
复制
'EGP'^_^'Egypt'
'USD'^_^'Europe'
'USD'^_^'Europe'
'USD'^_^'Europe'
'USD'^_^'Europe'
'Europe'^_^'SAR'
'USD'^_^'Europe'
'MYR'^_^'Malaysia'
'MYR'^_^'Malasia'

看一个巴什演示

票数 2
EN

Stack Overflow用户

发布于 2022-01-07 01:32:22

使用您所显示的示例,请尝试遵循awk程序。

代码语言:javascript
复制
awk -v matchvalue="'SAR'" -v updatedvalue="'USD'" '
match($0,"^"matchvalue"\\^_\\^"){
  print updatedvalue"^_^" substr($0,RSTART+RLENGTH)
  next
}
1
'  Input_file

解释:创建了两个名为matchvalueupdatedvalue的变量,在示例中使用OP显示的'SAR''USD'值。然后在主程序中使用match函数进行匹配,如果一行以'SAR'^_^开头,然后按其位置打印新值,然后打印行的其余部分,如果行不是从'SAR'^_^开始,那么只需打印它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70609230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档