sed 替换中间字符串

sed 替换中间字符串

我有这个字符串

22<>22

我有这个清单

test
dev
too

输出应该是这样的

22test22
22dev22
etc..

这是我用来执行此操作的命令

cat list | sed 's/$/22/g' | sed 's/^/22/g'

编辑

我用来执行此操作的命令

cat list | sed 's/$/22/' | sed 's/^/22/'

但这没有帮助,因为我有一个很大的清单

22<>22
3<>33
134423<>4

答案1

您可以将要替换的字符串列表分配给数组<>。在一个名为的文件中list.txt你应该有:

test
dev
too

在一个名为的文件中data.txt你应该有:

22<>22
3<>33
134423<>4

解决方案一: 读取文件list.txt并将其内容分配给数组。

使用 bash 读取数组

export IFS=$'\n'
readarray array < list.txt

使用 zsh 读取数组

array=("${(@f)"$(<list.txt)"}") 

最后,您必须迭代array变量以获取列表的每个元素并替换为sed

for i in ${array[@]}; do 
sed "s/<>/$i/g" data.txt
done

笔记:for 循环会将文本打印到标准输出(在您的终端中)。但如果你想将输出重定向到文件,你可以使用>afterdone关键字:

for i in ${array[@]}; do 
sed "s/<>/$i/g" data.txt
done > final.txt

该解决方案将产生如下输出:

22test22
3test33
134423test4
22dev22
3dev33
134423dev4
22too22
3too33
134423too4

解决方案2: 首先,您必须读取该文件list.txt并将其内容分配给一个数组。 使用 bash 读取数组

export IFS=$'\n'
readarray array < list.txt

使用 zsh 读取数组

array=("${(@f)"$(<list.txt)"}") 

之后,您必须迭代文件的每一行data.txt,并在该循环内读取数组中的每个项目以应用sed命令:

while read line ; do 
for i in ${array[@]}; do 
   sed "s/<>/$i/g" <<< "$line"
done
done < data.txt

或者将标准输出重定向到文件:

while read line ; do 
for i in ${array[@]}; do 
   sed "s/<>/$i/g" <<< "$line"
done
done < data.txt > final.txt

该解决方案将产生以下输出:

22test22
22dev22
22too22
3test33
3dev33
3too33
134423test4
134423dev4
134423too4

答案2

更改<>为一个字符|分隔符:

$ sed -s 's/<>/|/g' asdf1 > asdf2
$ cat asdf2
22|22
3|33
134423|4

使用相同的单字符|分隔符将 2 个文件合并为一个文件:

$ paste -d"|" asdf asdf2 > combined
$ cat combined
test|22|22
dev|3|33
too|134423|4

用 分割|,并按顺序打印:

$ awk -F'|' '{print $2 $1 $3}'  combined
22test22
3dev33
134423too4

所以,总而言之:

sed -s 's/<>/|/g' asdf1 > asdf2
paste -d"|" asdf asdf2 > combined
awk -F'|' '{print $3 $1 $2}'  combined

<>但这仅在每行中只有 1 个占位符时才有效。

答案3

对于zsh,假设list不包含$,`也不\包含字符:

$ cat list
22<>22
3<>33
134423<>4
$ cat data
test
dev
too
$ () {print -rC1 -- ${(e)${(f)"$(<list)"}//'<>'/'$^@'}; } ${(f)"$(<data)"}
22test22
22dev22
22too22
3test33
3dev33
3too33
134423test4
134423dev4
134423too4

我们将非空行data作为参数传递给匿名函数。在该函数中,我们在 的行中替换<>为,因此我们最终得到,并且使用xpand 参数扩展标志,执行其中的扩展,其中类似于(参数列表),只是数组扩展为/ - like 而不是 csh-like (用,扩展为而不是with )。$^@list22$^@22 3$^@33e$^@$@rcfisha=(1 2 3)before${^a}afterbefore1after before2after before3afterbefore1 2 3afterbefore${a}after

相关内容