我试图匹配某个字段,并从一个由多个字符分隔的文件中更新其数据。我使用它创建了一个SQL更新的仿制品。这是创建一个带有bash的小型DBMS的更大项目的一部分。
我尝试了什么:
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只更新这些特定的列,因为您无法进入它。
使用的分隔符是:^_^
数据文件示例:
'EGP'^_^'Egypt'
'SAR'^_^'Europe'
'SAR'^_^'Europe'
'SAR'^_^'Europe'
'SAR'^_^'Europe'
'Europe'^_^'SAR'
'SAR'^_^'Europe'
'MYR'^_^'Malaysia'
'MYR'^_^'Malasia'例如,我的$match可以是SAR,$update可以是USD
预期对数据文件的更改
'EGP'^_^'Egypt'
'USD'^_^'Europe'
'USD'^_^'Europe'
'USD'^_^'Europe'
'USD'^_^'Europe'
'Europe'^_^'SAR'
'USD'^_^'Europe'
'MYR'^_^'Malaysia'
'MYR'^_^'Malasia'如果有另一种更好的方法,这也是值得欢迎的,因为我对bash脚本相当陌生。
发布于 2022-01-06 15:20:14
最好在这里使用awk:
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'发布于 2022-01-06 15:34:28
使用sed,您可以在字符串$match的开头使用^,并使用$update更改它。
match="'SAR'"
update="'USD'"
sed "s/^$match\^_\^/$update^_^/" file输出
'EGP'^_^'Egypt'
'USD'^_^'Europe'
'USD'^_^'Europe'
'USD'^_^'Europe'
'USD'^_^'Europe'
'Europe'^_^'SAR'
'USD'^_^'Europe'
'MYR'^_^'Malaysia'
'MYR'^_^'Malasia'看一个巴什演示。
发布于 2022-01-07 01:32:22
使用您所显示的示例,请尝试遵循awk程序。
awk -v matchvalue="'SAR'" -v updatedvalue="'USD'" '
match($0,"^"matchvalue"\\^_\\^"){
print updatedvalue"^_^" substr($0,RSTART+RLENGTH)
next
}
1
' Input_file解释:创建了两个名为matchvalue和updatedvalue的变量,在示例中使用OP显示的'SAR'和'USD'值。然后在主程序中使用match函数进行匹配,如果一行以'SAR'^_^开头,然后按其位置打印新值,然后打印行的其余部分,如果行不是从'SAR'^_^开始,那么只需打印它。
https://stackoverflow.com/questions/70609230
复制相似问题