【问题标题】:Need help in displaying the output using shell script [duplicate]在使用 shell 脚本显示输出时需要帮助 [重复]
【发布时间】:2013-06-23 06:23:18
【问题描述】:

请帮助我解决以下问题。我有一个文件:

mat rat
mat dog
mat matress

我需要显示

rat
dog
matress

我使用sed 命令进行编码以显示输出:sed "s/$up//g"$up 将包含mat)。但是使用这个命令,我得到的输出是

rat
dog
ress

我该怎么做才能解决这个问题?
请帮忙。

【问题讨论】:

  • 虽然可以使用可能的重复 (SO 1032023) 来解决这个问题,但它需要一个依赖于版本的大锤来破解一个简单的问题。在这种情况下,正确的解决方案是删除g 后缀,以便代码仅删除前导mat。还有一个问题,要删除的模式是否应该是s/^mat //,后面有空格;这不会影响matress(或mattress)。

标签: shell sed command output


【解决方案1】:

sed 's/^mat //' /path/to/file 应该可以解决问题。注意没有g;这是s/foo/bar;不是s/foo/bar/g。此外,^ 将替换与每行的开头挂钩。

如果您确实要分配变量,例如$up,则可以使用sed "s/^$up//" /path/to/file

【讨论】:

    【解决方案2】:

    您当前的命令将删除任何位置的所有 $up 实例,包括一行中的多次出现和一行中间的出现。

    如果您只想匹配行首的$up,并且仅当它是一个完整的(空格分隔)单词时,请尝试以下命令:

    sed "s/^$up\>//"
    

    在 GNU sed 中,断言 ^ 匹配行首,\> 匹配单词结尾(非空白字符和空白字符之间的零宽度“字符”)。

    如果$up之前可能有空格,可以使用

    sed "s/\(\s*\)$up\>/\1/"
    

    这将仅删除 $up 并保留所有空格。

    如果您不想在$up 和它后面的文本之间保留空格,可以将\> 替换为\s\+,它匹配一个或多个(\+) 空格字符(@987654333 @);即,

    sed "s/^$up\s\+//"
    sed "s/\(\s*\)$up\s\+/\1/"
    

    【讨论】:

      【解决方案3】:

      使用awk

      awk '{print $NF}' inputFile
      

      测试:

      $ cat text
      mat rat
      mat dog
      mat matress
      
      $ awk '{print $NF}' text
      rat
      dog
      matress
      

      【讨论】:

      • 这不起作用。它只给了我一项输出
      • @user2519862 你能更具体地说明这个问题吗?我添加了一个示例测试,说明它如何显示您的需求?
      • 我有一个 a1.dat 文件,其中文件的内容是 abc def abc ghi abc abcjkl 我使用了 sed 命令 (sed "s/$up//g" a1.dat >a1.out) ...这里 $up 将包含 "abc" 。也就是说,我先读取 $up 然后使用 sed 命令将所有 abc 替换为 nothng .. 以便获得输出为 (def ghi abcjkl) 。但现在我得到 (def ghi jkl) 作为输出。理想情况下,我需要输出为(def ghi abcjkl)。请帮助
      • 从您的 sed 命令中删除 g 标记。这将阻止它在单行上进行多次更改。
      • 如果我删除 g,那么它将只替换第一行。理想情况下,我希望 mat 的所有出现都得到改变,(仅在第一列而不是在第二列)。这个概念是我只需要在第一列用空格替换 mat 的出现,第二列数据应该这样显示。
      【解决方案4】:

      /g 标志尝试对每一行多次应用替换命令。前两行很好,因为这个词只出现一次,但对于第三行,它将删除两者。

      您可以使用零宽度断言更具体地解决它,例如^,或GNU 扩展\b,例如:

      sed "s/^$up//g"
      

      sed "s/$up\b//g"
      

      虽然删除标志可能更容易,例如:

      sed "s/$up//"
      

      在所有三种情况下,结果都是相同的,至少对于这种简单的例子。

      【讨论】:

      • 它不起作用。当我执行上述语句时,单词 mat 也与输出一起附加。我需要移除垫子并只显示鼠狗床垫
      猜你喜欢
      • 2022-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2013-12-26
      相关资源
      最近更新 更多