Replace tr和括号

Replace tr和括号,replace,parentheses,tr,Replace,Parentheses,Tr,我有一个很大的文件,每行都有SQL查询。 但是该文件有一些bug,重新创建它会花费太多时间。 我有几行缺少分号。 我看到这些行总是以)结尾,然后是换行符。 因此,我所做的是: cat file.sql | tr ')\n' ');\n' > new_file.sql 但这只是在所有行上添加分号。我不明白,它似乎没有检测到括号。我只想找到所有以括号结尾但不带分号的行,并将其添加到换行符之前 我该怎么做?我知道sed不能处理换行符,所以我认为tr是最好的选择。不要使用tr,因为它可以处理字符

我有一个很大的文件,每行都有SQL查询。 但是该文件有一些bug,重新创建它会花费太多时间。 我有几行缺少分号。 我看到这些行总是以)结尾,然后是换行符。 因此,我所做的是:

cat file.sql | tr ')\n' ');\n' > new_file.sql
但这只是在所有行上添加分号。我不明白,它似乎没有检测到括号。我只想找到所有以括号结尾但不带分号的行,并将其添加到换行符之前


我该怎么做?我知道
sed
不能处理换行符,所以我认为
tr
是最好的选择。

不要使用
tr
,因为它可以处理字符集而不是字符串-你的命令会将所有
转换成
并将所有
\n
转换成
,忽略集合2中多余的字符:

pax> echo 'line1()
...> line2();
...> line3()' | tr ')\n' ');\n'

line1();line2();;line3();
sed
是此项工作的更好工具:

sed 's/)$/);/' file.sql > new_file.sql
这样做的目的是将任何
)$
序列(行尾的右括号)替换为
。你可以在下面的文字记录中看到它的作用:

pax> echo 'line1()
...> line2();
...> line3()' | sed 's/)$/);/'

line1();
line2();
line3();

嗯,很有趣。你能告诉我美元符号对sed意味着什么吗?谢谢。在
sed
中,
$
符号是行尾标记,否则它将替换每行上的第一个
,而不仅仅是行尾的标记。