在空格分隔的单词周围添加引号和新的分隔符

luf*_*ffe 3 sed text-processing regular-expression

我有以下字符串

y10_zcis y10_nom y10_infl y20_zcis y20_infl y30_zcis
Run Code Online (Sandbox Code Playgroud)

我想将其转换为

"y10_zcis", "y10_nom", "y10_infl", "y20_zcis", "y20_infl", "y30_zcis"
Run Code Online (Sandbox Code Playgroud)

我用极其丑陋的方式完成了类似的事情:

$ cat in.txt | sed 's/ /\'$'\n/g' | sed 's/\(.*\)/"\1",/g' | tr -d '\n'


"y10_zcis","y10_nom","y10_infl","y20_zcis","y20_infl","y30_zcis",
Run Code Online (Sandbox Code Playgroud)

但这感觉完全失败了,它没有处理最后一个不需要的,(但也许最好在之后删除)

tac*_*omi 5

你可以做

sed -e 's| |", "|g' -e 's|^|"|g' -e 's|$|"|g' in.txt
Run Code Online (Sandbox Code Playgroud)

在哪里

  • 's| |", "|g' 将用 ", "
  • 's|^|"|g'而开头没有空格,您必须^在行的开头指定,所以您要告诉,放在"开头。
  • 's|$|"|g' 同样的事情,但指定每一行的结尾 $

更新

正如@don_crissti 指出的那样,您可以使用以下方法缩短它的时间

sed 's| |", "|g;s|.*|"&"|'
Run Code Online (Sandbox Code Playgroud)

在哪里

  • ; 分开每条指令
  • .* 匹配整行。
  • & 在这种情况下,RHS 上的 & 符号被 LHS 上匹配的整个表达式替换 .*

    RHS=右手边

    LHS=左侧


iru*_*var 5

也许 awk

awk -vOFS=', ' '{for (k=1; k<=NF; ++k) $k="\""$k"\""; print}' file
"y10_zcis", "y10_nom", "y10_infl", "y20_zcis", "y20_infl", "y30_zcis", "y30_nom", "y30_infl"
Run Code Online (Sandbox Code Playgroud)