テキストファイルで複数の文字列を見つけて返します。

テキストファイルで複数の文字列を見つけて返します。

私はファイルから文字列を抽出し、bashを使用して他のファイルに追加する方法を探しています。関連ファイルには、次の形式のデータが含まれます。

Data="/dataset/0001" a bunch of random stuff I don't need Data="/dataset/0002" more random stuff Data="/dataset/0003"

など。

二重引用符(たとえば、、、、、、etc)の間にある文字列を抽出して返したいです/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 -osedこれは、データの抽出と変換にとの組み合わせを使用します。

grep -o各ビットをData="..."別々のラインにドラッグし、sed各ラインを最初ににData="変更して/home/userから"最後から削除します。

答え2

パールの使用:

$ 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

関連情報