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
。我通常使用花括号和