Unix 使用sed将文本替换为大括号

Unix 使用sed将文本替换为大括号,unix,replace,sed,Unix,Replace,Sed,我正试图找到以下文本 get_pins { 并将其替换为 get_pins -hierarchical {proc_top_*/ 我尝试过使用sed,但我不确定我做错了什么。我知道在花括号前面需要#,但我仍然无法让命令正常工作 我最接近于此: sed 's/get_pins #{#/get_pins -hierarchical #{#proc_top_*\//g' filename.txt > output 但它并没有达到我上面想要的替换效果。问题不在花括号中,而是在/中 这正是se

我正试图找到以下文本

get_pins {
并将其替换为

get_pins -hierarchical {proc_top_*/
我尝试过使用
sed
,但我不确定我做错了什么。我知道在花括号前面需要#,但我仍然无法让命令正常工作

我最接近于此:

sed 's/get_pins #{#/get_pins -hierarchical #{#proc_top_*\//g' filename.txt > output

但它并没有达到我上面想要的替换效果。

问题不在花括号中,而是在
/

这正是
sed
允许您使用备用分隔符的原因

下面的行使用
改为分隔符,并且对于包含
get\u pins{
的简单文件正确工作

sed 's!get_pins {!get_pins -hierarchical {proc_top_*/!g' Input.txt
输出:

get_pins -hierarchical {proc_top_*/
更新:基于mklement0的评论,并使用
csh
shell进行测试,以下内容应在
csh
中起作用

sed 's@get_pins {@get_pins -hierarchical {proc_top_*/@g' Input.txt

问题不在大括号中,而是在
/

这正是
sed
允许您使用备用分隔符的原因

下面的行使用
作为分隔符,并且对于包含
get_pins{
的简单文件正确工作

sed 's!get_pins {!get_pins -hierarchical {proc_top_*/!g' Input.txt
输出:

get_pins -hierarchical {proc_top_*/
更新:基于mklement0的评论,并使用
csh
shell进行测试,以下内容应在
csh
中起作用

sed 's@get_pins {@get_pins -hierarchical {proc_top_*/@g' Input.txt

@merlin2011的回答向您展示了如何使用可选分隔符,但关于命令不起作用的原因:

如果您只需删除语句中的所有
#
字符,实际上这是非常好的

sed 's/get_pins {/get_pins -hierarchical {proc_top_*\//'g filename.txt > output
这里涉及两个不同的转义要求:

  • 转义正则表达式分隔符的字面用法:这是正确的做法,将
    /
    转义为
    \/
  • 在正则表达式中具有特殊含义的转义字符通常:此转义总是使用
    \
    -前缀进行的,但在您的情况下,不需要这样的转义:因为您没有使用
    -E
    -r
    来表示使用扩展正则表达式,因此使用的是基本正则表达式{
实际上不是一个特殊字符,所以您不需要转义它。相反,如果您使用了
-E
-r
),那么您应该将
{
转义为
\{/code>

@merlin2011的答案向您展示了如何使用替代分隔符,但关于命令不起作用的原因:

如果您只需删除语句中的所有
#
字符,实际上这是非常好的

sed 's/get_pins {/get_pins -hierarchical {proc_top_*\//'g filename.txt > output
这里涉及两个不同的转义要求:

  • 转义正则表达式分隔符的字面用法:这是正确的做法,将
    /
    转义为
    \/
  • 在正则表达式中具有特殊含义的转义字符通常:此转义总是使用
    \
    -前缀进行的,但在您的情况下,不需要这样的转义:因为您没有使用
    -E
    -r
    来表示使用扩展正则表达式,因此使用的是基本正则表达式{
实际上不是一个特殊字符,所以您不需要转义它。相反,如果您使用了
-E
-r
),那么您应该将
{
转义为
\{/code>

awk
应替换:

awk '{sub(/get_pins {/,"get_pins -hierarchical {proc_top_*/")}1'

awk
应进行更换:

awk '{sub(/get_pins {/,"get_pins -hierarchical {proc_top_*/")}1'


我的输出是:get_pins:Event notfound@starboxsed的哪个版本和哪个平台?@starbox:听起来你在使用
[t]csh
,命令行所谓的历史扩展功能正在妨碍您-尝试将所有
字符替换为
@
字符。例如,
csh
是否认真尝试在单引号内扩展字符?@Sigi,根据我的测试,是的。这可能是
bash
是mo的原因之一我的输出是:get_pins:Event notfound@starboxsed的哪个版本和哪个平台?@starbox:听起来你在使用
[t]csh
,命令行所谓的历史扩展功能正在妨碍您-尝试将所有
字符替换为
@
字符。例如,
csh
是否认真尝试在单引号内扩展字符?@Sigi,根据我的测试,是的。这可能是
bash
是mo的原因之一你最近很受欢迎。为什么你需要用
#
括起来
{
?这是不对的。@starbox,请参阅更新的答案。我刚刚用
csh
测试了你的问题。你为什么需要括起来
{
使用
#
?这是不正确的。@starbox,请查看更新的答案。我刚刚使用
csh
进行了测试,并重现了您的问题。有时,
awk
的答案与
sed
问题是一个令人耳目一新的对比-这不是那种情况:这只是稍微冗长和棘手的问题(
1
以确保即使没有匹配的输入行也能打印出来)版本的
sed
命令应该注意的是,
sed
命令是解决当前问题的一个非常合适的解决方案。@mklement0我缺少了花括号,如果不需要的话,我肯定不会使用
1
。这与
sed
一样好。OP提到他确实尝试了
sed
,而不是说他只需要
sed
解决方案。现在您已经让它变得更详细了-如果没有大括号,它会工作(显然,当
awk
发现多个模式的计算结果为true而没有相关操作时,它仍然只打印(可能修改的)行一次);概括一下我的观点:使用不同于OP要求的工具的解决方案可能是一个令人耳目一新的选择,但您的解决方案不是。@mklement0 OP并没有说他每行需要多个替换,如果是这样,请将
sub
更改为
gsub
。我通常使用花括号和