Bash - 删除之前的行的最后一个字符?

时间:2014-11-18 14:54:07

标签: bash

我正在尝试格式化数据库脚本,我需要从“)之前的行中删除最后一个”,“但我还没有成功...

这是输入文件

DROP TABLE IF EXISTS attribute_type;
CREATE TABLE attribute_type (
  attribute_type_id int(11) NOT NULL,
  name varchar(30) COLLATE es_CO.UTF-8 NOT NULL,
  description text COLLATE es_CO.UTF-8,
  is_set smallint(6) DEFAULT NULL,    <-- Here is the last character I want to remove
),


DROP TABLE IF EXISTS attribute_type_options;
CREATE TABLE attribute_type_options (
  attribute_type_options_id int(11) NOT NULL,
  person_attribute_type_id int(11) DEFAULT NULL,
  name varchar(60) COLLATE es_CO.UTF-8 NOT NULL,
  default_value bit(1) DEFAULT NULL,    <-- Here is the last character I want to remove
),

这应该是输出

DROP TABLE IF EXISTS attribute_type;
CREATE TABLE attribute_type (
  attribute_type_id int(11) NOT NULL,
  name varchar(30) COLLATE es_CO.UTF-8 NOT NULL,
  description text COLLATE es_CO.UTF-8,
  is_set smallint(6) DEFAULT NULL
),


DROP TABLE IF EXISTS attribute_type_options;
CREATE TABLE attribute_type_options (
  attribute_type_options_id int(11) NOT NULL,
  person_attribute_type_id int(11) DEFAULT NULL,
  name varchar(60) COLLATE es_CO.UTF-8 NOT NULL,
  default_value bit(1) DEFAULT NULL
),

我试过了this solution,但是它改变了所有行,而不仅仅是我需要的地方 谢谢你的帮助!!!

5 个答案:

答案 0 :(得分:0)

这个perl命令行可以处理这个:

perl -0pe 's/,(?=\n\),\n)//g' file
DROP TABLE IF EXISTS attribute_type;
CREATE TABLE attribute_type (
  attribute_type_id int(11) NOT NULL,
  name varchar(30) COLLATE es_CO.UTF-8 NOT NULL,
  description text COLLATE es_CO.UTF-8,
  is_set smallint(6) DEFAULT NULL
),


DROP TABLE IF EXISTS attribute_type_options;
CREATE TABLE attribute_type_options (
  attribute_type_options_id int(11) NOT NULL,
  person_attribute_type_id int(11) DEFAULT NULL,
  name varchar(60) COLLATE es_CO.UTF-8 NOT NULL,
  default_value bit(1) DEFAULT NULL
),

答案 1 :(得分:0)

尝试这样做:

perl -0pe 's/,\s*\n\)/\n)/g' file

  • -0允许perl读取整个文件而不是逐行读取
  • -p就像使用while (<>) {}构造并打印每一行sed
  • s/,\n\)/\n)/g是正则表达式替换

另一种解决方案

使用纯

while read line; do
    if [[ $line =~ ^\),\s* ]]; then
        echo "${lastline%,}"
    else
        echo "$lastline"
    fi

    lastline="$line"
done < file

答案 2 :(得分:0)

我没有足够的声誉来评论,但只想添加@ anubhava的答案:

他建议:perl -0pe 's/,(?=\n\),\n)//g' file

我认为如果存在尾随空格,则应将其更改为perl -0pe 's/,(?=\s*\n\),\n)//g' file

答案 3 :(得分:0)

试试这个:

sed -n 'H;${;g; s/\([^,]\),\n)/\1\n)/g;p}' file.sql

答案 4 :(得分:0)

awk版本:

 awk '/^\),$/{a=substr(a, 0, length(a))} {print a;a=$0}END{print a}' f

a&#34; store&#34;上一行。对于每一行,您打印上一行(print a;),并在aa=$0

中指定一行

但如果该行只包含),/^\),$/),则在执行打印/存储(a=substr(a, 0, length(a)))之前删除最后一个字符。

最后(END{...)打印最后一行。