unix:查找与列表中的字符串匹配的字符串,然后修改字符串的最后一个字符

时间:2017-08-16 00:02:12

标签: unix awk sed

假设我在文件中有以下内容:

AAA|population:A1
BBB|population:A1
CCC|population:A2
DDD|population:A1

我想更改以BBB和DDD开头的行,以便文件变为:

AAA|population:A1
BBB|population:A2
CCC|population:A2
DDD|population:A2

我想创建一个包含要查找的所有字符串的变量(在本例中为BBB和DDD),然后仅更改与该字符串匹配的所有行的最后一个字符(在本例中为“1”)。

变量看起来像:

myList='BBB|DDD' 

然后我应该可以使用awk进行替换,但我不知道如何只替换匹配的最后一个字符。

3 个答案:

答案 0 :(得分:0)

使用sed:

R=2; myList="BBB DDD"; matches=$(echo $myList | sed 's/\ /\\|/g'); sed  -i  "s/\($matches\)\(.*\).$/\1\2$R/g" file1

鉴于该文件名为file1。您可以在R中的同一命令行中传递您想要的字符。 myList应该是您想要匹配的字符串的单个空格

这会修改file1。

file1之前和之后的差异看起来像

 $ diff file1 file1_old
2c2
< BBB|population:A2
---
> BBB|population:A1
4c4
< DDD|population:A2
---
> DDD|population:A1

答案 1 :(得分:0)

$ myList='BBB|DDD'; i=2; sed -ri "s/(($myList).*).$/\1$i/" file

简要说明,

  • -r:扩展正则表达式的选项,因此可以省略某些转义字符
  • 请注意使用双引号展开shell变量$myList$i
  • 您可以添加所需的字符串$myList

答案 2 :(得分:0)

我的最终答案如下。假设文件名是“test”

myList='BBB|DDD'
R='2'
sed -E "s/(($myList).*).$/\1$R/" test

给出了理想的结果。

AAA|population:A1
BBB|population:A2
CCC|population:A2
DDD|population:A2