Regex 如果换行符不存在,如何删除换行符';t以“结束”;带尾随空格

Regex 如果换行符不存在,如何删除换行符';t以“结束”;带尾随空格,regex,awk,sed,Regex,Awk,Sed,但另一个参数是有尾随空格,如 样本数据: "data","123" <-spaces "data2","qwer" <-space "false","234 <-spaces And i'm the culprit" <-- spaces at the start of line and end of line "data5","234567" 本质上,我想修复我的csv文件(非常大) 我正在使用sed,因此sed中的答案将非常有用:) 编辑:在示

但另一个参数是有尾随空格,如

样本数据:

"data","123"    <-spaces
"data2","qwer" <-space
"false","234   <-spaces
     And i'm the culprit"  <-- spaces at the start of line and end of line
"data5","234567"
本质上,我想修复我的csv文件(非常大)

我正在使用sed,因此sed中的答案将非常有用:)


编辑:在示例文本中添加空格

您可以尝试以下操作

awk '/[a-zA-Z0-9][^"]*$/{ORS=""} /[a-zA-Z0-9]"[^"]*$/{ORS="\n"} 1 '
测试

$ awk '/[a-zA-Z0-9][^"]*$/{ORS=""} /[a-zA-Z0-9]"[^"]*$/{ORS="\n"} 1  ' input
"data","123"
"data2","qwer"
"false","234And i'm the culprit"
"data5","234567"
它的作用是什么?

  • [a-zA-Z0-9][^”]*$
    匹配所有末尾没有
    的行

    • {ORS=”“}
      将输出记录分隔符设置为
  • [a-zA-Z0-9]“[^”]*$
    匹配以
    结尾的所有行。

    • {ORS=“\n”}
      将字段记录分隔符设置为
      \n

    • 您可以尝试以下方法

      awk '/[a-zA-Z0-9][^"]*$/{ORS=""} /[a-zA-Z0-9]"[^"]*$/{ORS="\n"} 1 '
      
      测试

      $ awk '/[a-zA-Z0-9][^"]*$/{ORS=""} /[a-zA-Z0-9]"[^"]*$/{ORS="\n"} 1  ' input
      "data","123"
      "data2","qwer"
      "false","234And i'm the culprit"
      "data5","234567"
      
      它的作用是什么?

      • [a-zA-Z0-9][^”]*$
        匹配所有末尾没有
        的行

        • {ORS=”“}
          将输出记录分隔符设置为
      • [a-zA-Z0-9]“[^”]*$
        匹配以
        结尾的所有行。

        • {ORS=“\n”}
          将字段记录分隔符设置为
          \n

      我在示例输入的末尾添加了一行,其中包括一个以空格开头的字段,因为测试该字段是否适用于您得到的任何建议解决方案非常重要:

      $ cat file
      "data","123"
      "data2","qwer"
      "false","234
      And i'm the culprit"
      "data5","234567"
      "stuff","
      foo"
      
      因此,您可以看到换行符和空白:

      $ sed 's/$/\$/' file
      "data","123"   $
      "data2","qwer"   $
      "false","234   $
      And i'm the culprit"$
      "data5","234567"$
      "stuff","   $
      foo"$
      
      如果您只想删除换行符,但留下尾随的空白,那么这个awk命令就是您所需要的(仅通过管道传输到sed以显示换行符)

      如果要删除字段中的尾随空白,请执行以下操作:

      $ awk '{q+=gsub(/"/,"&"); if (q%2) sub(/[[:blank:]]+$/,""); printf "%s%s",$0,(q%2?"":RS)}' file | sed 's/$/\$/'
      "data","123"   $
      "data2","qwer"   $
      "false","234And i'm the culprit"$
      "data5","234567"$
      "stuff","foo"$
      
      在上述所有情况下,
      sed
      命令只需在行尾粘贴一个
      $
      ,以使尾部空白可见。在本例中,您只需使用awk命令即可


      它所做的只是计算到目前为止您已经看到了多少个
      q+=gsub(/”/,“&”)
      )。如果是奇数(<代码> Q% 2 <代码> 1 ),那么您就在一个字段的中间,所以不要在行的末尾打印换行符,否则,只需打印通常的记录分隔符,它是一个换行符。

      我在示例输入的末尾添加了一行,其中包括一个以空格开头的字段,因为测试该字段是否适用于您得到的任何建议解决方案非常重要:

      $ cat file
      "data","123"
      "data2","qwer"
      "false","234
      And i'm the culprit"
      "data5","234567"
      "stuff","
      foo"
      
      因此,您可以看到换行符和空白:

      $ sed 's/$/\$/' file
      "data","123"   $
      "data2","qwer"   $
      "false","234   $
      And i'm the culprit"$
      "data5","234567"$
      "stuff","   $
      foo"$
      
      如果您只想删除换行符,但留下尾随的空白,那么这个awk命令就是您所需要的(仅通过管道传输到sed以显示换行符)

      如果要删除字段中的尾随空白,请执行以下操作:

      $ awk '{q+=gsub(/"/,"&"); if (q%2) sub(/[[:blank:]]+$/,""); printf "%s%s",$0,(q%2?"":RS)}' file | sed 's/$/\$/'
      "data","123"   $
      "data2","qwer"   $
      "false","234And i'm the culprit"$
      "data5","234567"$
      "stuff","foo"$
      
      在上述所有情况下,
      sed
      命令只需在行尾粘贴一个
      $
      ,以使尾部空白可见。在本例中,您只需使用awk命令即可

      它所做的只是计算到目前为止您已经看到了多少个
      q+=gsub(/”/,“&”)
      )。如果是奇数(<代码> Q% 2 <代码> 1 < /代码>),那么您就在一个字段的中间,所以不要在行的末尾打印换行符,否则只打印通常的记录分隔符,这是换行符。

      < p>这可能对您(GNU SED):

      如果该行包含两个用逗号分隔的双引号字段,则删除最后一个双引号后面的任何内容,即可完成操作。否则,请追加下一行并删除其换行符,然后重试。

      这可能适用于您(GNU-sed):


      如果该行包含两个用逗号分隔的双引号字段,则删除最后一个双引号后面的任何内容,即可完成操作。否则,请追加下一行并删除其换行符,然后重试。

      现在很难处理的情况是,行上的最后一个字段以空格开头,例如,
      “\nfoo”
      ,其中
      \n
      是文字换行符,因此如果可能,请更新示例输入以显示它。使问题变得更加困难的原因是,您无法仅通过查找
      “\n
      来判断该
      是否是字段的结尾或开头。为了您自己的利益,请不要尝试使用sed。所有用于处理跨多行输入的Archene-sed语言结构在20世纪70年代中期awk发明时已经过时。现在最难处理的情况是,行上有一个以空格开头的最后字段,例如
      “\nfoo”
      其中
      \n
      是一个文字换行符,因此如果可能,请更新示例输入以显示它。使问题变得更加困难的原因是,您无法仅通过查找
      “\n
      来判断该
      是否是字段的结尾或开头。为了您自己的利益,请不要尝试使用sed,因为在20世纪70年代中期,当awk发明时,所有用于处理跨多行输入的Archene-sed语言结构都已过时。如果一行上的最后一个字段以空格开头,例如
      “\nfoo”
      ,上述操作将失败。有关包含该案例的示例输入,请参见我的答案。如果一个字段包含下划线或其他非字母数字字符,我怀疑它也会失败。如果一行的最后一个字段以空格开头,例如
      “\nfoo”
      ,上述操作将失败。有关包含该案例的示例输入,请参见我的答案。我怀疑如果字段包含下划线或其他非字母数字字符,它也会失败。