我有这个字符串
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 )。$^@
list
22$^@22
3$^@33
e
$^@
$@
rc
fish
a=(1 2 3)
before${^a}after
before1after
before2after
before3after
before1
2
3after
before${a}after