我有一个文件,例如:
ID_SOUR_CALENDAR BIGINT NOT NULL DEFAULT 0 COMPRESS 0 ,
UNIQUE PRIMARY INDEX ( CALENDAR_DATE );
ID ,
ID_SOUR ,
PRIMARY INDEX ( CALENDAR_DATE );
我想将包含 PRIMARY 的行之前的行中的 ',' 替换为 ')'。
结果应该是:
ID_SOUR_CALENDAR BIGINT NOT NULL DEFAULT 0 COMPRESS 0 )
UNIQUE PRIMARY INDEX ( CALENDAR_DATE );
ID ,
ID_SOUR )
PRIMARY INDEX ( CALENDAR_DATE );
答案1
使用GNU sed
:
sed 'N;s/,\(\s*\n.*PRIMARY\)/)\1/;P;D' file
ID_SOUR_CALENDAR BIGINT NOT NULL DEFAULT 0 COMPRESS 0 )
UNIQUE PRIMARY INDEX ( CALENDAR_DATE );
ID ,
ID_SOUR )
PRIMARY INDEX ( CALENDAR_DATE );
N
将下一行输入读取/附加到模式空间中。P
打印到当前模式空间的第一个嵌入换行符。D
最多删除模式空间中第一个嵌入的换行符。开始下一个周期,但如果模式空间中仍有数据,则跳过从输入读取。
答案2
尝试反转文件,在线进行字符串替换后PRIMARY,然后重新反转文件:
tac file | sed '/PRIMARY/ {n; s/,$/)/}' | tac
答案3
尝试这个,
perl -0777 -pe 's/,([^\n,]*\n[^\n]*PRIMARY)/)$1/g'
这会将包含 在内的任何行之前的最后一个替换,
为in 行。)
PRIMARY
解释
perl -0777
slurp 整个文件(读为一行)s/search_pattern/replacement/g
全局替换搜索模式
答案4
和POSIX-莱 sed
您可以执行以下操作:
sed -e '
/PRIMARY/!{x;1!p;d;}
x;s/,/)/;$G
' input-file.txt
输出:
ID_SOUR_CALENDAR BIGINT NOT NULL DEFAULT 0 COMPRESS 0 )
UNIQUE PRIMARY INDEX ( CALENDAR_DATE );
ID ,
ID_SOUR )
PRIMARY INDEX ( CALENDAR_DATE );
在职的:
- 对于非 PRIMARY 行,我们保存该行并打印我们在保留中保存的行。
- 对于 PRIMARY,我们检索前一个并进行转换。