在使用 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