所以我基本上是从文件中读取第一行,并且我希望修剪第一个和最后一个字符,但前提是它们等于某个字符。我希望从字符串中删除“{”和“}”,但前提是它们分别是第一个和最后一个字符。
输入:
{Some_random_data_here, {more data here}, test}
输出:
Some_random_data, {more data here}, test
这是我正在使用的完整命令,它能够删除第一个命令,但不能删除最后一个命令。
$(head -n 1 "$filePath" | sed s/^{//;s/}$//)
OP的当前代码和完整输出:
建议:
$( .... )
包装器,因为我们不想执行sed
脚本的结果sed
将脚本用单引号括起来,以便;
将其视为sed
脚本的一部分(而不是将其视为bash
命令分隔符)对OP当前代码进行这些更改:
虽然这将使OP的当前代码适用于这个特定的数据,但它实际上并不满足OP的要求,即两个字符在删除之前必须存在。请考虑以下示例,其中一个书挡缺失:
在这两种情况下,即使两个字符都不存在,前导
{
或尾随也会被删除。}
sed
使用捕获组和在两个书挡上匹配的正则表达式的一个想法:在哪里:
-E
- 启用扩展正则表达式支持^\{
- 匹配输入 (^
) 的开头,后跟{
; 我们需要转义{
否则它被视为sed
脚本语言的一部分,即我们希望它被视为文字{
}$
-}
在输入末尾匹配 ($
)(.*)
- (第一个)捕获组匹配^{
和之间的所有内容}$
\1
- 引用(第一个)捕获组的内容^{
和上获得双重匹配}$
^{
第三个示例删除了书挡,因为我们在和上获得了成功的双重匹配}$
当我测试它时,你的解决方案有效,我只需要转义
;
.使用
bash
版本 >= 3.0 和正则表达式:输出:
读取第一行并删除大括号可以使用纯 POSIX shell ( ) 代码来完成
sh
(因此它可以与 Bash、Dash 等一起使用):如果您只想在左大括号和右大括号都存在时删除大括号,则此 POSIX shell 代码可以做到这一点:
请注意,使用 GNU 时,链接
sed
表达式是可以的,但并非所有表达式都支持它。在这种情况下,您可以使用编号反向引用将替换表达式与单独的选项分开,例如:':'
sed
sed
-e
或等效的开始/结束修剪:
使用/输出示例
或者
或者
或者
如果您遇到奇怪的系统,请注意。