我正在寻找一种使用 bash 从文件中提取字符串并将其附加到另一个文件的方法。相关文件包含以下格式的数据:
Data="/dataset/0001" a bunch of random stuff I don't need Data="/dataset/0002" more random stuff Data="/dataset/0003"
等等。
我希望提取并返回双引号之间的字符串(即,,,,等/dataset/0001
)。 /dataset/0002
/dataset/0003
关于如何去做这件事有什么建议吗?
作为后续问题,如果能够/home/user
在每个返回值(即 、 、 等)之前添加一个常量字符串(例如 ),/home/user/dataset/0001
那就/home/user/dataset/0002
太/home/user/dataset/0003
简洁了。
感谢您对此的任何建议。
答案1
$ grep -o 'Data="[^"]*"' file | sed 's,Data=",/home/user,; s/"$//'
/home/user/dataset/0001
/home/user/dataset/0002
/home/user/dataset/0003
grep -o
这使用和 的组合sed
来进行数据的提取和转换。
将grep -o
每个位拉到Data="..."
单独的行上,而sed
将这些行中的每一行首先替换Data="
为/home/user
,然后"
在最后删除。
答案2
使用 Perl:
$ perl -lnE 'say for map { "/home/user" . $_ } /Data="(.*?)"/g' file
/home/user/dataset/0001
/home/user/dataset/0002
/home/user/dataset/0003
答案3
我不建议这样做,因为
但只是为了说明,重复应用 bash=~
运算符:
#!/bin/bash
pfx="/home/user"
re='Data="([^"]*)"'
while read -r line; do
while [[ $line =~ $re ]]; do
printf '%s%s\n' "$pfx" "${BASH_REMATCH[1]}"
line="${line#*${BASH_REMATCH[0]}}"
done
done < file
答案4
以下是您可以用来获取输出的一些方法:
perl -lsne '
() = /Data="(.*?)"(?{print "$v$1"})/g;
' -- -v="/home/user" file
grep -oP 'Data="\K[^"]+(?=")' file |\
xargs printf '/home/user%s\n'
sed -nEe '
s|Data="([^"]+)"|\n/home/user\1\n|
s/.*\n(.*\n)/\1/
P;D
' file
/home/user/dataset/0001
/home/user/dataset/0002
/home/user/dataset/0003