打印,修改,再次打印Bash变量

时间:2016-09-25 12:13:39

标签: bash macos shell csv printf

我正在循环CSV文件。文件的每一行的格式都是这样的(它的Open Street Maps数据):

  

planet_85.287_27.665_51a5fb91,AcDbEntity:AcDbPolyline,{[name] Purano   巴士公园 - Thimi [类型]路线[路线] microbus [参考] 10} {[Id] 13.0   [Srid] 3857 [FieldsTableId]

这遵循以下格式:

  

层,小类ExtendedEntity,线型,EntityHandle,文本

我想为Name添加新列。我可以通过在[name]之前和之后切断所有内容来找到一行中的名字。此代码成功创建了一个包含所有名称的新行描述文件(我以CSV格式打开,然后将其作为新列复制粘贴到原始文件中)。

cat /path/to/myfile.csv | while read line
    do
    if [[ ${line} == *"name"* ]]
        then
            printf "$(echo $line | LC_ALL=C sed 's/^.*name\]//g'| LC_ALL=C cut -f1 -d'[') \n"
        else
            printf "\n"
    fi
done >/path/to/newrow.csv

这个系统显然不是最理想的 - 我更倾向于打印整个最后一行。但当我用这个替换printf行时:

printf "$line,$(echo $line | LC_ALL=C sed 's/^.*name\]//g'| LC_ALL=C cut -f1 -d'[') \n"

它打印行但不打印名称。我尝试在单独的打印语句中打印它们,打印行然后回显名称,将名称保存在变量中然后打印,以及其他一些技术,每次我要么a)只打印行或者b)在新行上打印名称,这会破坏CSV格式。

我做错了什么?如何打印完整的原始行,并在末尾添加名称作为新列?

注意:我在MacBook Pro 15上的macOS Sierra终端上运行它"视网膜。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望在[name][type]之间提取名称,并附加为新的最后一个CSV列。您可以使用捕获组执行此操作:

sed -e 's/.*\[name\] \(.*\) \[type\].*/&,\1/' < input

注意中间的\(.*\)。这会捕获[name][type]之间的文字。

在替换字符串中,&代表匹配的字符串,即整个行,因为模式以.*开头和结尾。 接下来,,是一个文字逗号,\1代表第一个捕获组的内容,即\(...\)内匹配的部分。