首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除文本文件中多行字符串的第一个字符。

删除文本文件中多行字符串的第一个字符。
EN

Unix & Linux用户
提问于 2021-06-17 05:27:29
回答 3查看 372关注 0票数 -1

我正在自动化Ubuntu20.04VM的构建过程。看起来Ubuntu20.04在默认情况下是禁用bash完成的。我想默认情况下在构建时启用此功能。我使用的生命周期管理系统允许我在VM启动完全构建之前运行一些最终命令。我需要的是通过/etc/bash.bashrc为所有用户启用bash完成。

目前,已构建的机器的/etc/bash.bashrc如下所示:

代码语言:javascript
复制
# System-wide .bashrc file for interactive bash(1) shells.

...

# enable bash completion in interactive shells
#if ! shopt -oq posix; then
#  if [ -f /usr/share/bash-completion/bash_completion ]; then
#    . /usr/share/bash-completion/bash_completion
#  elif [ -f /etc/bash_completion ]; then
#    . /etc/bash_completion
#  fi
#fi

...

EOF

我想删除行#之后的每个# enable bash completion in interactive shells字符。其结果应该是:

代码语言:javascript
复制
# System-wide .bashrc file for interactive bash(1) shells.

...

# enable bash completion in interactive shells
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

...

EOF

我尝试编写了一个sed命令,但是没有任何进展。任何想法都将不胜感激。谢谢!

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2021-06-17 05:35:27

试着做这样的事情:

代码语言:javascript
复制
sed -i -e '/^# enable bash completion/,/^#fi/ {
             s/^#//;
             s/^ enable bash completion/#&/;
           }' /etc/bash.bashrc

这将从从#开始的行到以#fi开头的下一行的所有行中剥离前导# enable bash completion,然后将#重新放置在enable bash ...行的开头。

票数 0
EN

Unix & Linux用户

发布于 2021-06-17 05:37:58

使用awk

以下内容将在第五次记录之后从记录开始时删除#

代码语言:javascript
复制
awk 'NR>5{sub(/^#/,"");}1' input

代码语言:javascript
复制
awk 'NR==1,/^# enable/{print;next}{sub(/^#/,"");print }' input

NR==1,/^# enable/{print;next}从第一条记录打印到记录,从# enable开始。next语句意味着不会对这些记录采取进一步的行动。

然后,sub()函数从记录开始时删除#

另一种方法:这是awk中的方法,如@cas在答案中所描述的那样。

代码语言:javascript
复制
awk '/^# enable/,/^#fi/
{if (/^# enable/) ; else sub(/^#/,"")}1' input
票数 0
EN

Unix & Linux用户

发布于 2021-06-26 14:16:39

代码语言:javascript
复制
sed -n -e '
 /^# enable bash completion/{
  h 
  :a {
   n
   /^#fi$/!{
    H 
    ba
   }
  }
  g
  s/#//g
  s/.*/#&\nfi/
 }
 p
' data

如果得到bash completion部分并将每行附加到保持空间中,则将行保存在等待空间中,直到到达最后一个fi为止。此时获取保持空间的内容,并: 1)删除所有#,2)在enable bash completion ...前面放置一个#,并将最终的fi附加到块中。

添加-i选项,让sed对文件本身进行更改:sed -n -i -e 'the previous sed command'

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/654597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档