【问题标题】:How can I remove a substring of a string in a shell script?如何在 shell 脚本中删除字符串的子字符串?
【发布时间】:2012-12-21 01:54:44
【问题描述】:

我有一个包含以下单词列表的文件:

FIRST_WORD abc
FIRST_WORD(1) bcd
FIRST_WORD(2) def
SECOND_WORD gh
THIRD_WORD jiu
THIRD_WORD(1) lom
...

我想删除(i),当它存在时,获得:

FIRST_WORD abc
FIRST_WORD bcd
FIRST_WORD def
SECOND_WORD gh
THIRD_WORD jiu
THIRD_WORD lom
...

【问题讨论】:

  • 问题标题与示例不符!?
  • 所以如果(i) 出现在其他地方,它不应该被替换,或者除了示例之外它永远不会出现?
  • @ChrisSeymour 由于OP很久没有回复,我更新了问题标题。请考虑删除您的评论并更新your answer(最好的IMO)以提及这一点。

标签: string shell sed scripting


【解决方案1】:

你可以得到它:

test="123456"
echo ${test:3}

输出:

456

【讨论】:

  • test="123456 abc" echo ${test:3} 作为输出 456 abc。我要获取123 abc
  • @user1835630 是与标题和示例不同的问题吗?你到底想做什么?
  • 然后试试:echo ${test:0:3},你会得到123
  • 它给了我不好的替代品
【解决方案2】:

使用sed全局替换括号内的所有数字字符串:

$ sed 's/([0-9]\+)//g' file
FIRST_WORD abc
FIRST_WORD bcd
FIRST_WORD def
SECOND_WORD gh
THIRD_WORD jiu
THIRD_WORD lom

# Save the changes back to the file  
$ sed -i 's/([0-9]\+)//g' file

使用sed删除前3个字符:

$ sed 's/^...//' file
ST_WORD abc
ST_WORD(1) bcd
ST_WORD(2) def
OND_WORD gh
RD_WORD jiu
RD_WORD(1) lom

【讨论】:

    【解决方案3】:

    试试这个。

    sed 's/([0-9])//g' file
    

    【讨论】:

      【解决方案4】:

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

      sed -r '$!N;s/^((\S+).*\n\2)\([^)]*\)/\1/;P;D' file
      

      但是,如果:

      sed 's/([0-9]\+)//' file
      

      足够了。

      【讨论】:

        【解决方案5】:

        这是一个纯 bash 实现:

        while read -r a b; do
            echo "${a%(*)}" "$b"
        done < input.txt
        

        【讨论】:

          猜你喜欢
          • 2012-11-14
          • 2016-04-12
          • 2013-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多