假设我在文件中有以下内容:
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进行替换,但我不知道如何只替换匹配的最后一个字符。
答案 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
:扩展正则表达式的选项,因此可以省略某些转义字符$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