我有下一个文件myfile.txt
window.ShowDialog()
我想在普通视图中执行此文件:
"field1","val1","val2","val3"
"field2","val1","val2","val3"
"field3","val1","va
l2","va
l3"
"field4","val1","val2","val3"
所以,我试图用下一个命令来做到这一点:
"field1","val1","val2","val3"
"field2","val1","val2","val3"
"field3","val1","val2","val3"
"field4","val1","val2","val3"
但有些不对劲。请帮助我,我不是unix命令的大师
答案 0 :(得分:1)
试试这个:
filename=$1
while read -r line
do
found=$found$(echo $line | grep '[^"]')
if [[ -n $found && $found == *\" ]]; then
echo $found;
found=''
fi
done < "$filename"
$found
总是以这种方式附加到自身,您将加入“断行”。$found
是否为空(-n
是否为空),然后检查$found
是否以@Barmar建议的报价结尾如果它以一个结尾的引号结束,那么你echo $found
将变量设置为空
答案 1 :(得分:1)
sed 解决方案:
sed -Ez 's/[[:space:]]+//g; s/""/","/g; s/(([^,]+,){3})([^,]+),/\1\3\n/g; $a\\' myfile.txt
-z
- 将输入视为由空(零)字符而不是换行符分隔的行
s/[[:space:]]+//g
- 删除行之间/行内的空格
s/""/","/g
- 分隔包裹/破坏的相邻字段
s/(([^,]+,){3})([^,]+),/\1\3\n/g
- 在每个第4个字段设置换行符(记录分隔符)
$a\\
- 在内容的末尾附加最后一个换行符
输出:
"field1","val1","val2","val3"
"field2","val1","val2","val3"
"field3","val1","val2","val3"
"field4","val1","val2","val3"
答案 2 :(得分:0)
在不知道输入数量的字段的情况下,您可以使用FPAT
和gensub
来使用此gnu-awk解决方案:
awk -v RS= -v FPAT='("[^"]*"|[^,"]+),?' -v OFS= '{
for (h=1; h<=NF; h++) $h = gensub(/([^"])\n[[:blank:]]*/, "\\1", "g", $h); } 1' file
"field1","val1","val2","val3"
"field2","val1","val2","val3"
"field3","val1","val2","val3"
"field4","val1","val2","val3"
要将更改保存回文件使用:
awk -i inplace -v RS= -v FPAT='("[^"]*"|[^,"]+),?' -v OFS= '{
for (h=1; h<=NF; h++) $h = gensub(/([^"])\n[[:blank:]]*/, "\\1", "g", $h); } 1' file