合并 2 sed 而不保存文件中的更改

合并 2 sed 而不保存文件中的更改

在使用 sed 读取和搜索文件 word 以及包含 word 的注释行然后保存时,是否可以从文件中删除像 \ 这样的特殊符号,但 \ 将就位?

我的意思是我有一个包含公司名称(2 个单词)的文件,它们之间可以有一些字符,并且在原始文件中对这些符号使用字符转义(正则表达式)。例如

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\_M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\.M$/"
lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

我用什么都不替换 \ 并发表评论,但我也想像以前一样用 \ 保存。我想要的输出:

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
#lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

我的脚本是:

sed -E -e 's/\\//g' -i -e '/ITALY.*Delta M/s/^/#/' file.txt

但它保存时没有 \.是的,我知道我可以,不删除,只搜索“Red\\\\ Park”。但是,如果我有 20 个名称,我不想为每个由 2-3 个单词组成的公司名称键入 \\\\ :) 或者您可能有另一个愿景,使用另一个命令(而不是 sed)来完成此操作?我愿意接受每一个建议或帮助 我有可能得到我想要的吗?太感谢了!

答案1

如果我理解正确,让我们看看这是否适合您:

sed -E -e 's/^(.*\w+)\\\\ /#\1\\\\ /' -e 's/\\\\.([^ ]*)$/\\\\ \1/ file

输出:

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
#lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

答案2

都说坚持是一种美德......

我假设所有 2 个名称公司均由\\和 1 个字符分隔,并且国家/地区始终为大写字母,所有公司至少包含一个小写字母,即公司不能是国家/地区的子字符串。

解决awk方案(如果您支持该-i inplace选项);我相信大多数人都会

awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\\' 'BEGIN{
    OFS="\\"}
    $1~country && NR>1?$(NR-2)$NR:$1~company{
        printf "#"}
    NF>1{$NF=" "substr($NF,2)
    };1' file1
Output

#lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"
lunar_static KKK_FRANCE_NUM "/^08.00.Green\\ Banana$/"

演练

告诉awk进行更改-i inplace并将您的国家/地区和公司作为变量传递-v。由于您\\的文件中后面有一个未知的分隔符,因此请.在公司名称的两个部分之间使用

awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\' 'BEGIN{

将字段分隔符设置为中断,\这将为您提供\\出现的 3 个字段,然后设置

        OFS="\\"} 

如果出现中断,则在打印时将它们放回原处。

如果第一个字段$1==country是比赛的第一部分。

对于公司,检查您是否拆分\并最终得到多个字段NR>1,然后根据情况对最后 2 个字段或未拆分字段进行测试。

如果我们有匹配项printf #(即打印时不带换行符)

        $1~country && NR>1?$(NR-2)$NR:$1~company{
        printf "#"}

如果您有多个字段,NF>1那么您会在公司名称之间进行拆分,并希望在打印时\\?确保该字段是空格,因此请删除最后一个字段的第一个字符并将其替换为空格?

    NF>1{$NF=" "substr($NF,2)

并打印

;1' file1

相关内容