私はファイルから文字列を抽出し、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 -o
sed
これは、データの抽出と変換にとの組み合わせを使用します。
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