我们要从以下文件中删除Word--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 enables extended regular expressions (needed for + and grouping). , and I using the "" before the "-" and "+"

注意--感谢对我的sed语法的 comments ,如果我遗漏了什么

我的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语法以删除额外的空格呢?

推荐答案

额外的空格shouldn't对以后解析这些选项的任何内容都很重要,除非它是编写得非常糟糕的代码.假设是这种情况,并且额外的空格会导致错误...

像往常一样,如果您想要对脚本中的一个文件进行edit,并且您的第一个倾向是转到sed -i,我建议您使用ed.与sed的S -i选项不同,它是标准化的,在任何地方都是一样的,这意味着当你在不同的环境中 run 时,你不太可能遇到不受欢迎的意外.不过,如果确实需要,您可以调整以下正则表达式以使用sed:

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

这里的诀窍是也匹配0个或更多前面和后面的空格,但只在输出中保留两个空格中的一个(在本例中是第一个).

这也只是try 在行中替换您感兴趣的内容所在的特定变量,以防您要删除的选项出现在其他地方(例如,在注释中),而您希望保留该选项.


由于这是标记为Perl的perl版本:

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

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

Linux相关问答推荐

C++17:G++8.5版似乎无法正确生成无符号64位伪随机整数

如何在不使用LD_LIBRARY_PATH或RPATH的情况下运行链接到共享库的二进制文件?

通过添加1位数字替换最后4位数字(不包括0x)

如何在我的 PC 上配置 GitLab 和 GitHub ssh 密钥

无法放弃所有权限,但可以放弃 CAP_SETUID 权限.

将(覆盖)文件移动到不同位置的同名文件夹中

如何使用 sed 和 awk 命令提取模式?

删除一行和它之前的一行

我需要制作一个 awk 脚本来解析文件中的文本.我不确定我是否做得正确

ftell 在文件描述符上?

判断指定名称的画面是否存在

当命令太长时,命令行会自动覆盖

如何在 Linux 中命名线程?

如何准确复制文件夹

如何下载较旧的 google play 服务?

rm 没有释放磁盘空间

/var 中有什么?

如何在 linux 中使用 CMake 和 Kdevelop 编译 GLUT + OpenGL 项目?

使用 SED 将单词的首字母大写

在类 Unix 系统中上次运行的 cron 作业(job)的详细信息?