我有一个包含
的文本文件CREATE TABLE attribute_type
ALTER TABLE table ADD PRIMARY KEY...,
ALTER TABLE table ADD CONSTRAINT...
CREATE TABLE attribute_type_options
ALTER TABLE table ADD PRIMARY KEY...,
ALTER TABLE table ADD CONSTRAINT...,
CREATE INDEX person_attribute_type_set ON table...,
ALTER TABLE table ADD CONSTRAINT...
...
...
我想删除以 CREATE TABLE table_name word table_name 开头的行,并在找到以下行之前替换以下行中的单词 table CREATE TABLE ...
的新行输出应为
CREATE TABLE attribute_type
ALTER TABLE attribute_type ADD PRIMARY KEY...,
ALTER TABLE attribute_type ADD CONSTRAINT...
CREATE TABLE attribute_type_options
ALTER TABLE attribute_type_options ADD PRIMARY KEY...,
ALTER TABLE attribute_type_options ADD CONSTRAINT...,
CREATE INDEX person_attribute_type_set ON attribute_type_options...,
ALTER TABLE attribute_type_options ADD CONSTRAINT...
...
...
我做某事......但是没有用!
#!/bin/bash
while read line
do
if [[ "$line" =~ ^CREATE.* ]]; then
#would need to do something like
#name=`awk '{print $3}' $line`
else
#sed -i 's/table/name/' $line
fi
done < $1
如何正确地做到这一点?
答案 0 :(得分:0)
这会接收文件input
,进行替换,并写入文件output
:
awk '{if (/^CREATE TABLE/) {name=$3} else sub("table", name);print}' input >output
if (/^CREATE TABLE/) {name=$3}
如果该行以CREATE ALTER
开头,则我们将第三个字段保存为名称。
else sub("table", name)
否则,我们会在任意一行找到table
的第一个匹配项,并将其替换为变量name
中保存的值。
print
最后,我们打印出该行。
使用当前版本问题的示例输入,生成的输出为:
$ awk '{if (/CREATE TABLE/) {name=$3} else sub("table", name);print}' input
CREATE TABLE attribute_type
ALTER TABLE attribute_type ADD PRIMARY KEY...,
ALTER TABLE attribute_type ADD CONSTRAINT...
CREATE TABLE attribute_type_options
ALTER TABLE attribute_type_options ADD PRIMARY KEY...,
ALTER TABLE attribute_type_options ADD CONSTRAINT...,
CREATE INDEX person_attribute_type_set ON attribute_type_options...,
ALTER TABLE attribute_type_options ADD CONSTRAINT...
...
...
此代码是在更新问题之前编写的,该问题在输出中添加了空行。