Sed:替换特定的一位/两位数字

Sed:替换特定的一位/两位数字

我的表中有数据。在一列中,我需要将一些索引(从 1 到 23 的数字)替换为 3-4 位样本数字,例如:2347,3856 等。

所以原来的列看起来像:

SF=1,2
SF=12,7
SF=17,4

输出应该是:

SF=2347,3856
SF=8553,9539
...

问题是:如果我对一个样本(1->2720)执行此操作,那就没问题;但是用某些东西替换 2 会造成混乱等,并且我不知道如何指定应该替换该数字,例如,如果它只是一个(两位)数字?连续的数字可能超过 2 个。

抱歉,如果听起来令人困惑。我是初学者。

更新。谢谢你麦吉克我部分成功了。但由于某种原因,新行是在连续第一次替换后创建的,然后下一个数字显然没有被替换。所以我得到的是:

SF=2347

,2

SF=8553

,7

这是代码:

'sed "s/=${index},/=${sample},/g; s/,${index} /,${sample} /g; s/,${index},/,${sample },/g" 样本.txt'

为什么会发生这种情况?

答案1

思考,你正在尝试做这样的事情:

$ sed 's/=1,/=2347,/g; s/=12,/=3856,/g' sedtest.txt
SF=2347,2
SF=3856,15
SF=17,4

在模式和替换字符串中包含文字“=”和“,”可以让您区分“=1”和“=12”


更新:

取代两个都变量,在 sed 中,可以使用 $ 来匹配行尾。

$ sed 's/=1,/=2347,/g; s/=12,/=3856,/g; s/,2$/,2342/g; s/,15$/,234325/g' sedtest.txt
SF=2347,2342
SF=3856,234325
SF=17,4

当你混合像 ${var} 这样的 bash 变量时,它看起来会很奇怪,但如果你使用双引号,它应该可以工作:

例如,

$ a=42
$ sed "s/=1,/=2347,/g; s/=12,/=${a},/g; s/,2$/,2342/g; s/,15$/,234325/g" sedtest.txt
SF=2347,2342
SF=42,234325
SF=17,4

顺便说一句,如果您的替换内容很大,您可以使用 sed 中的文件清理所有这些内容。例如,

$ cat ./datascript.sed 
# Sed script to do stuff
s/=1,/=2347,/g
s/=12,/=2342,/g
s/,2$/,2342/g
s/,15$/,234325/g

然后针对数据运行该文件

$ sed -f datascript.sed sedtest.txt
SF=2347,2342
SF=2342,234325
SF=17,4

这些文件的缺点是我不知道如何在其中使用变量。

相关内容