【问题标题】:Trying to comment a source file试图评论源文件
【发布时间】:2020-12-15 05:31:16
【问题描述】:

我正在尝试注释源代码行,以便类似 朗='ENG'; 变成 // LANG = 'ENG';

源文件中有超过一千行,“ENG”不是唯一的,而是整行。 我放弃了对空间的通配,只是“按原样”尝试了整个现存的行,但没有任何乐趣。 类似(注释shell)--

enter code here

#!/bin/bash
#if [  -n "$5" ] ; then
#if [ "$5" == "ENG" ] ; then

sed -i "s/'         LANG                                   = '\''ENG'\''/\/\/'       LANG'                                  
=  '\''ENG'\''/" vc.pas > vc.out

#fi
#fi

所以它减少到一行。无论我尝试什么都不快乐。 蒂亚! 豪伊

【问题讨论】:

  • 试试sed "s~.*LANG *= *'ENG';.*~//&~" vc.pas > vc.out

标签: bash sed match quote


【解决方案1】:

这对我有用,将任何空格传递到输出:

$ echo "LANG='ENG';" | sed "s#^\(\s*LANG\s*=\s*'ENG'\s*;\)#// \1#"
// LANG='ENG';
$ echo "   LANG  = 'ENG'  ;   " | sed "s#^\(\s*LANG\s*=\s*'ENG'\s*;\)#// \1#"
//    LANG  = 'ENG'  ;   

从技术上讲,它需要在双引号字符串中使用双反斜杠,但由于没有一个序列构成有效的转义序列,bash 不介意。

【讨论】:

  • 我的 sed 不理解 \s\S,请您提供一个便携式解决方案吗?
  • 很抱歉。将\s 替换为[[:space:]]
  • 谢谢托马斯!您能否澄清一下 # 在 SED 语句中的作用??
  • 好的,我认为 # 只是代替 '/' 的占位符,例如 ':'(冒号)
  • s/foo/bar/ 可以写成s#foo#bar#s 之后的任何字符都将成为模式分隔符。
【解决方案2】:

使用 GNU sed,使用

sed -i "s,.*LANG *= *'ENG';.*,//&," vc.pas

在哪里

  • -i - 启用内联文件修改
  • s - 替换命令
  • , - 分隔符
  • .*LANG *= *'ENG';.* - 包含 LANG = 'ENG'; 的文本,= 周围有任意数量的空格
  • //& - 将匹配的行替换为 // 和行本身

【讨论】:

【解决方案3】:

使用正则表达式进行行选择,然后进行替换。将替换命令放在一个文件中:

$ cat dt.sed                                                                                                      
/^LANG[[:space:]]*=[[:space:]]*'[^']*'/s;^;// ;
$ 

然后使用该脚本运行 sed(1):

$ echo "LANG='FOO'" | sed -f dt.sed
// LANG='FOO'

这适用于 Fedora 34 系统,但应该适用于任何 Linux。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2012-05-11
    相关资源
    最近更新 更多