Linux 为什么使用sed删除不起作用?

Linux 为什么使用sed删除不起作用?,linux,awk,sed,Linux,Awk,Sed,我正在使用Linux。我有一个yml文件,我想使用sed删除此文件: exposureMachineSshAccess username: password: whiteList: - mLB99 - mLB10 machines: - machineId: username: '' password: '' - machineId: username: '' password: '' 我创建了这个正则表达式,看起来还

我正在使用Linux。我有一个yml文件,我想使用sed删除此文件:

exposureMachineSshAccess  
  username:
  password:
  whiteList:
    - mLB99
    - mLB10
  machines:
  - machineId:
    username: ''
    password: ''
  - machineId:
    username: ''
    password: ''
我创建了这个正则表达式,看起来还可以:

exposureMachineSshAccess:\n([ ].*\n)+
我称之为:

sed -i '/exposureMachineSshAccess:\n([ ].*\n)+/d'  /home/common_config.yml
sed -i 's/exposureMachineSshAccess:/d/gm' /home/common_config.yml

如果我删除正则表达式,我会更改文件,但反过来就不行了。有什么问题吗?

使用
tac
sed
的解决方案:它将删除输入文件中最后出现的字符串
密码:
,如果您不想这样做,那么解决方案2可以帮助您:

tac Input_file | sed "/    password: ''/,/exposureMachineSshAccess/d" | tac
假设以下是输入_文件:

cat Input_file
exposureMachineSshAccess
  username:
  password:
  whiteList:
    - mLB99
    - mLB10
  machines:
  - machineId:
    username: ''
    password: ''
  - machineId:
    username: ''
    password: ''
singh is king ......
test1221
运行上述代码后,输出如下:

tac  Input_file | sed "/    password: ''/,/exposureMachineSshAccess/d" | tac
testtest1221  test
singh is king ......
test1221
解决方案二:


正则表达式不工作的原因是
sed
一次只检查一行。您要删除地址范围中的行,其中起始地址为
exposureMachineSshAccess
行,结束地址为
password:

sed -i '/exposureMachineSshAccess/,/    password:/d' common_config.yml
这仍然不精确,因为它要求密码行是此YAML记录中的最后一行。如果记录之间有空行,请将其用作结束地址。如果有可靠的缩进,可能会停在与左边距齐平的下一行(但这需要对脚本进行一些重构,以避免删除范围末尾的行)

正确的解决方案是使用正确理解YAML的工具。我为这个问题提出了一个副本,其中包含一些模糊的有前途的短Python片段,可能比嚼口香糖和胶带方法更精确、更健壮,也就是说,尝试只使用正则表达式处理结构化文件格式。

这可能适合您(GNU-sed):


这将复制节标题。将节头追加到每行,并根据节头匹配项打印/删除。

这将从文件中第一次出现的
密码:
的任何位置删除,而不限于当前的YAML记录。@tripleee,对不起tripleee先生,我认为这是OP需要的,字符串OP粘贴(并尝试放入正则表达式中)应该删除。如果我做错了什么,请纠正我,然后可以改进。@DOWN VOTER:请在此处告诉我DOWN vote的原因??假设其中有数百条记录带有
密码:
,但只有一条记录以
exposureMachineSshAccess
@tripleee开头,是的,我记住了这一点,所以只有我在使用
tac
如果OP可以让我知道OP只需要第一次出现,然后可以更改代码。可能重复的
sed -i '/exposureMachineSshAccess/,/    password:/d' common_config.yml
sed '/^\S/h;G;/\nexposureMachineSshAccess/!P;d' file