查找并返回文本文件中的多个字符串

查找并返回文本文件中的多个字符串

我正在寻找一种使用 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

相关内容