bash - 是否可以使用 shell 命令查找和替换包含单个字符的行?
问题描述
是否可以使用sed
orawk
或任何其他 shell 命令来识别带有单个字符的行,例如)
,然后用其他东西替换它?可能有很多行包含)
但它只替换有单个字符的行)
。例子:
exp = ... +
( x
+ 2*(y)
+ z
)
+ ...
我想要得到的是以下内容
exp = ... +
( x
+ 2*(y)
+ z
}
+ ...
如果我使用普通的 sed 命令来替换)
它,它将用)
.
sed -i -e 's/)/\}/g' file
会给
exp = ... +
( x
+ 2*(y}
+ z
}
+ ...
有出路吗?
编辑:带有嵌套括号的示例,其中单行包含内部嵌套括号,该解决方案不起作用(对于此示例):
sed -e 's/(\(.*\))/{\1}/g'
...
+ LNb * (
+ ( - 224/27 + ( - 8/3)*Lqf^2 + (80/9)*Lqf)*CF*NF
+ (1616/27 - 56*[Zeta[3]] + ( - 536/9 + 16*[Zeta[2]])*Lqf + (44/3)*
Lqf^2)*CF*CA
+ ((32 - 128*[Zeta[2]])*Lqf)*CF^2
)
+ ...
这使
...
+ LNb * (
+ { - 224/27 + ( - 8/3)*Lqf^2 + (80/9)*Lqf}*CF*NF
+ {1616/27 - 56*[Zeta[3]] + ( - 536/9 + 16*[Zeta[2]])*Lqf + (44/3}*
Lqf^2)*CF*CA
+ {(32 - 128*[Zeta[2]])*Lqf}*CF^2
)
+ ...
不像
...
+ LNb * {
+ ( - 224/27 + ( - 8/3)*Lqf^2 + (80/9)*Lqf)*CF*NF
+ (1616/27 - 56*[Zeta[3]] + ( - 536/9 + 16*[Zeta[2]])*Lqf + (44/3)*
Lqf^2)*CF*CA
+ ((32 - 128*[Zeta[2]])*Lqf)*CF^2
}
+ ...
而我知道如何避免它,例如我可以合并行,使其成为单行,然后我可以使用命令将最外层替换(...)
为{...}
. 然而,这些还有一些其他后果,并不是这个问题所特有的。
我的主要查询不是为这些示例解决问题,而是要了解是否可以检测和替换)
文件中仅包含一个字符而没有其他字符的行,其中文件可能有许多其他出现的)
字符,这些字符将是完好无损的。
解决方案
对于任何 POSIX sed:
$ sed 's/^\([[:space:]]*\))\([[:space:]]*\)$/\1}\2/' file
exp = ... +
( x
+ 2*(y)
+ z
}
+ ...
推荐阅读
- javascript - 一周完成后切换或隐藏/显示链接
- python - 将多个列表从 Python 传递到 PHP 数组?
- arrays - Groovy 遍历 Maps 的 Arraylist
- linux - 有没有办法在页面大小之外对齐 mmap()ed 内存?
- api - 如何防止在没有用户交互(用户名、密码)的情况下在网站中滥用内部 API 调用?
- java - 使用 HtmlUnit 启用 JavaScript 的问题
- php - 如何在 PHP 中使用 cURL/HTTP 将数据插入 CloudTables 数据库?错误:需要 API 密钥
- javascript - 计算数组中出现的次数并对其进行排序
- reactjs - 使用反应更改 html 属性值没有带有 onclick 事件的数据
- amazon-web-services - 放大认证异常