bash текстовый файл с разделителями - PullRequest
0 голосов
/ 30 ноября 2018

файл примера

aaa [bbb bb] ccc "ddd dd" eee
bbb [ccc cc] ddd "eee ee" fff

ожидается:

line1
s1="aaa", s2="bbb bb", s3="ccc", s4="ddd dd", s5="eee"
line2
s1="bbb", s2="ccc cc", s3="ddd", s5="eee ee", s5="fff"

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

только для bash -

$: IFS=']"[' read -a line < infile # read the "groups"
$: line=( "${line[@]% }" )         # strip training spaces
$: line=( "${line[@]# }" )         # strip leading spaces

Массив line теперь содержит ваши очищенные данные.

Показано в шагах -

$: IFS=']"[' read -a line < infile
$: printf "[%s]\n" "${line[@]}"
[aaa ]
[bbb bb]
[ ccc ]
[ddd dd]
[ eee]
$: line=( "${line[@]% }" )
$: printf "[%s]\n" "${line[@]}"
[aaa]
[bbb bb]
[ ccc]
[ddd dd]
[ eee]
$: line=( "${line[@]# }" )
$: printf "[%s]\n" "${line[@]}"
[aaa]
[bbb bb]
[ccc]
[ddd dd]
[eee]
0 голосов
/ 30 ноября 2018

Используя gnu awk, вы можете использовать это:

awk -v OFS=", " -v FPAT='\\[[^]]*\\]|"[^"]*"|[^[:space:]]+' '{
   for (i=1; i<=NF; i++) {
      gsub(/^[["]|[]"]$/, "", $i)
      $i = "s" i "=\"" $i "\""
   }
   $0 = "line" NR ORS $0
} 1' file

Выход:

line1
s1="aaa", s2="bbb bb", s3="ccc", s4="ddd dd", s5="eee"
line2
s1="bbb", s2="ccc cc", s3="ddd", s4="eee ee", s5="fff"
...