我正在尝试格式化数据库脚本,我需要从“)之前的行中删除最后一个”,“但我还没有成功...
这是输入文件
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,但是它改变了所有行,而不仅仅是我需要的地方 谢谢你的帮助!!!
答案 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
是正则表达式替换使用纯bash:
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;
),并在a
(a=$0
)
但如果该行只包含),
(/^\),$/
),则在执行打印/存储(a=substr(a, 0, length(a))
)之前删除最后一个字符。
最后(END{...
)打印最后一行。