【问题标题】:Using sed to append a line with alt characters使用 sed 附加带有 alt 字符的行
【发布时间】:2020-05-23 21:02:38
【问题描述】:

我有这个文件,我想在其中添加一行,但在使用 alt 字符时我似乎遇到了问题。 这是脚本片段:

#testfile.txt
Main
├────►projectA
└────►projectC
sed "/├────►projectA/a ├────►projectB/" testfile.txt

sed 似乎没有找到“├────►projectA”部分。 Grep 甚至不会找到它。

grep "├────►projectA" testfile.txt

grep 什么都不返回。

那么你怎样才能找到它,以便我可以在它下面添加我的行?

编辑:我发现了我的问题。我在 sed 命令中使用了错误的字符。这个脚本在不同的系统上,所以我不得不做一个例子。

我正在尝试在 /a 之后添加空格,但它会修剪它。有没有办法保留空间?
(例如“[5 个空格] ├────►projectB”)
我不能在上面的行中添加空格,因为 stakoverflow 格式也会修剪它。所以我说[5个空格]来表示空格的数量。

【问题讨论】:

  • 我怀疑您的终端中的编码不同,文件中的编码也不同,或者您的文件中可能还有其他无法打印的字符从终端中丢失。请发布likehexdump -C testfile.txt 的输出和echo "├────►projectA" | hexdump -C 的输出,并将比较字节。注意:sed 中的a 命令不以/ 结尾。例如,如果我复制并粘贴您提供的代码,sedgrep 对我有用。 testfile.txt 是如何生成的?
  • 根据你想变得多么挑剔,sed "/projectA/a ├────►projectB/" 可能会很麻烦,但我更喜欢尽可能精确。
  • 按照你为我写的那样工作,尽管它在末尾添加了/,它不在 A 和 C 行上。
  • 是的,我注意到如果我不使用 alt 字符,这将按预期工作。是的,我注意到我最后也得到了斜线。我确信这是导致问题的 alt 字符。当我在第一部分(使用 projectA)中没有它时,它可以工作。
  • 我看到了我的问题。我用错了字符。

标签: bash sed


【解决方案1】:

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

sed '/^├────►projectA$/{p;s/A/B/}' file

匹配────►projectA,打印该行,然后用B 替换A

使用 sed 命令 l0 以八进制和 ascii 格式查看每一行的表示。

所以这和上面的一样:

sed '/^\o342\o224\o234\o342\o224\o200\o342\o224\o200\o342\o224\o200\o342\o224\o200\o342\o226\o272projectA$/{p;s/A/B/}' file

要在这样一行的前面添加 5 个空格,请使用:

sed '/^├────►projectA$/{p;s/^/     /;s/A/B/}' file

或者您可能更喜欢:

sed '/^\(├────►project\)A$/{p;s/     \1B/}' file

【讨论】:

    【解决方案2】:

    在我看来,您似乎正在尝试使用 sed 附加文字字符串(即包含任何字符的字符串),但 sed 不理解文字字符串,只能理解正则表达式和启用反向引用的替换,见Is it possible to escape regex metacharacters reliably with sed。相反,您应该使用像 awk 这样可以理解文字字符串的工具。

    这就是你想做的全部吗?

    $ awk '{print} index($0,"├────►projectA"){print "├────►projectB"}' file
    #testfile.txt
    Main
    ├────►projectA
    ├────►projectB
    └────►projectC
    

    如果要 5 个前导空格,只需在 print 语句中的字符串中添加 5 个前导空格即可:

    $ awk '{print} index($0,"├────►projectA"){print "     ├────►projectB"}' file
    #testfile.txt
    Main
    ├────►projectA
         ├────►projectB
    └────►projectC
    

    如果您只想复制前一行的缩进,这里是您输入文件的修改版本:

    $ cat file
    #testfile.txt
       Main
         ├────►projectA
         └────►projectC
    

    下面是如何使用前一行使用的任何缩进(空格和/或制表符)打印新行:

    $ awk '{print} s=index($0,"├────►projectA"){print substr($0,1,s-1) "├────►projectB"}' file
    #testfile.txt
       Main
         ├────►projectA
         ├────►projectB
         └────►projectC
    

    【讨论】:

    • 呃,sed 中的 a 命令确实需要一个文字字符串; ic 命令也是如此。
    • @tripleee 但他们之前的/regexp/ 没有。
    猜你喜欢
    • 2011-03-08
    • 2018-07-02
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 2018-02-22
    • 2018-11-14
    相关资源
    最近更新 更多