【问题标题】:How do I cut letter X out of a word?如何从单词中删除字母 X?
【发布时间】:2016-04-08 02:09:44
【问题描述】:

我需要从一个单词中删除字母 X: 例如:我需要把星球大战的第一个字母,慕尼黑的第四个字母,...

1 star wars
4 munich
5 casino royale
7 the fast and the furious
52 a fish called wanda

tar wars
munch
casio royale
the fat and the furious
a fish called wanda

我已经用 cut 试过了,但是没有用。 这是我的命令: sed 's/^\([0-9]*\) \(.*\)/ echo \2 | cut -c \1/'

所以它给了我这个输出:

 echo star wars | cut -c 5
 echo munich | cut -c 5
 echo casino royale | cut -c 5
 echo the fast and the furious | cut -c 5
 echo a fish called wanda | cut -c 52

如果我将它发送到 bash。我只得到单词的第 X 个字母。

我需要使用 sed 和其他命令进行练习。但我不能使用 awk 或 perl。

谢谢

【问题讨论】:

    标签: bash sed cut


    【解决方案1】:

    您可以只使用 bash 及其参数扩展:

    while read n s ; do
        echo "${s:0:n-1}${s:n}"
    done < input.txt
    

    如果需要一行,只需删除换行符并添加分号:

    while read n s ; do echo "${s:0:n-1}${s:n}" ; done < input.txt
    

    如果你真的需要使用sedcut,也是可行的,但可读性差一些:

    cat -n input.txt \
    | sed 's/\t\([0-9]\+\).*/s=\\(.\\{\1\\}\\).=\\1=/' \
    | sed -f- <(sed 's/[0-9]*//' input.txt) \
    | cut -c2-
    

    解释:

    1. 给行编号
    2. 将每一行转换为一个 sed 命令,用于搜索给定数量的字符并删除它们后面的字符
    3. 对删除了数字的原始文件运行生成的 sed 命令
    4. 删除多余的前导空格

    【讨论】:

    • 是的,但我不能使用 bash shell 脚本。我需要用一行命令来完成
    【解决方案2】:

    你可以这样使用sed

    sed -e '1s/\([a-z]\)\{1\}//' -e 's/^[0-9]\+\s\+\(.*\)/\1/g' file.txt
    

    第一个sed 正则表达式适用于第一行并替换第一个字符,第二个正则表达式适用于其余文本,1 列:一个或多个,2 列;一个或多个空格,之后我将剩余的测试放在一个匹配 \(.*\) 中并用这个匹配替换所有。

    【讨论】:

    • 谢谢你这个工作,但我不完全理解这个命令。在第一个 sed 中,您替换了一个字母并将其更改为空,然后您取第一个数字,但我不明白 + 的作用。
    • 确实如此。我试图将 1s 替换为 1,$s 的 %s,就像在 vi(m) 中一样,但这不起作用。
    • @Aleandro + — 匹配最后一个“块”一次或多次——“ba+”匹配“ba”、“baa”、“baaa”等,可以阅读en.wikibooks.org/wiki/Regular_Expressions/…跨度>
    【解决方案3】:

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

    sed 's/^\([0-9]*\) \(.*\)/echo '\''\2'\''|sed '\''s\/.\/\/\1'\''/e' file
    

    这使用s 命令的e 标志来评估RHS,并使用来自LHS 的反向引用运行第二次sed 调用。也许更容易让人眼前一亮:

    sed -r 's/^([0-9]*) (.*)/echo "\2"|sed "s#.##\1"/e' file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 2023-01-16
      • 2016-01-14
      相关资源
      最近更新 更多