为啥使用 sed 删除不起作用?

Posted

技术标签:

【中文标题】为啥使用 sed 删除不起作用?【英文标题】:Why delete using sed is not working?为什么使用 sed 删除不起作用? 【发布时间】:2018-07-27 04:34:23 【问题描述】:

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

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

【问题讨论】:

***.com/questions/5014632/…的可能重复 【参考方案1】:

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

sed -i '/exposureMachineSshAccess/,/    password:/d' common_config.yml

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

正确的解决方案是使用正确理解 YAML 的工具。我为这个问题提出了一个副本,它有一些模糊的 Python sn-ps,它可能比口香糖和胶带方法更精确、更健壮,即尝试仅使用正则表达式处理结构化文件格式。

【讨论】:

【参考方案2】:

tacsed 的解决方案:如果您不想这样做,它将删除 Input_file 中字符串 password: 的最后一次出现,那么解决方案 2nd 可以帮助您:

tac Input_file | sed "/    password: ''/,/exposureMachineSshAccess/d" | tac

假设以下是 Input_file:

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: ''/d"   Input_file

【讨论】:

这将从文件中第一次出现的password: 中删除,不受当前 YAML 记录的限制。 @tripleee,对不起,tripleee 先生,我认为这是 OP 需要的,应该删除字符串 OP 粘贴(并尝试放入正则表达式)。如果我做错了什么,请纠正我,然后可以改进它。 @DOWN VOTER:请在这里告诉我投反对票的原因?? 假设有数百条带有password:的记录,但只有一条以exposureMachineSshAccess开头。 @tripleee,是的,我牢记这一点,所以只有我使用tac,如果 OP 可以让我知道 OP 只希望它第一次出现然后可以更改代码。【参考方案3】:

这可能对你有用(GNU sed):

sed '/^\S/h;G;/\nexposureMachineSshAccess/!P;d' file

这会复制节标题。将节标题附加到每一行并根据节标题匹配打印/删除。

【讨论】:

以上是关于为啥使用 sed 删除不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 Mongoose JS 删除嵌入式子文档数组的元素不起作用?

为啥在javascript中删除对象不起作用[重复]

为啥我的列表视图上的删除按钮不起作用[重复]

React.js:为啥删除按钮不起作用?

为啥java更新查询不起作用?

为啥(ngModel)不起作用?