regex sed +从文本中删除单词,不添加空格

pexxcrt2  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(186)

我们要从以下文件中删除单词--XX:+UseCMSInitiatingOccupancyOnly

more hdfs.conf

SHARED_HADOOP_NAMENODE_OPTS="-server -XX:ParallelGCThreads=8 -XX:+UseCMSInitiatingOccupancyOnly -Xms{{namenode_heapsize}}"

所以我们做了以下工作:

sed -i -E  's/\-XX:\+UseCMSInitiatingOccupancyOnly//g' hdfs.conf

-E启用扩展正则表达式(+和分组需要)。,而我在“-”和“+”之前使用“”

注意--感谢评论关于我的sed语法的评论以及我是否遗漏了什么
我的sed的问题是,当我们删除单词时,我们有一个额外的空格(根据我的sed建议)
我们得到的例子

more hdfs.conf

SHARED_HADOOP_NAMENODE_OPTS="-server -XX:ParallelGCThreads=8  -Xms{{namenode_heapsize}}"

而不是获取没有额外空格的行

more hdfs.conf

SHARED_HADOOP_NAMENODE_OPTS="-server -XX:ParallelGCThreads=8 -Xms{{namenode_heapsize}}"

那么,如何改进sed语法以删除额外的空间呢?

oaxa6hgo

oaxa6hgo1#

额外的空格 * 不应该 * 对以后解析这些选项的任何东西都无关紧要,除非它真的写得很糟糕。假设是这种情况,并且额外的空间导致错误...
和往常一样,如果你想在脚本中艾德一个文件,并且你的第一个倾向是转向sed -i,我建议使用ed。与sed-i选项不同,它是标准化的,并且在任何地方的行为都是相同的,这意味着您在不同的环境中运行时不太可能遇到不受欢迎的意外。但是,如果确实需要,您可以调整以下正则表达式以使用sed

ed -s hdfs.conf <<'EOF'
/^SHARED_HADOOP_NAMENODE_OPTS=/ s/\( *\)-XX:+UseCMSInitiatingOccupancyOnly */\1/
w
EOF

这里的技巧是匹配0个或更多的前后空格,但只在输出中保留两个中的一个(本例中的第一个)。
这也只是尝试在设置您感兴趣的内容的特定变量的行上进行替换,以防您要删除的选项出现在其他地方(例如,在注解中)并且您希望保留该出现。
因为它被标记为perl,一个perl版本:

perl -pi -e 's/\s*\K\Q-XX:+UseCMSInitiatingOccupancyOnly\E\s*// if /^SHARED_HADOOP_NAMENODE_OPTS/' hdfs.conf

(里面的东西\Q ... \E按字面意思处理,因此+不需要转义,\K基本上会从最终匹配的文本中丢弃在它之前匹配的内容,这意味着您不需要前导空白字符的显式捕获组(\s匹配的是哪个字符,而不是文字空格)

相关问题