【问题标题】:Replace '>' with '>\n' in several files in shell/bash在 shell/bash 的几个文件中将 '>' 替换为 '>\n'
【发布时间】:2018-07-23 02:51:46
【问题描述】:

我在一个文件夹中有多个文件,我想将所有这些文件中的字符 > 替换为 >\n

但无论我做什么,\n 字符都不会添加到 > 字符之后。

我尝试了以下方法:

echo '>ABCCHACAC' | tr '\>' '>\\n'
echo '>ABCCHACAC' | tr '>' '>\\n'
echo '>ABCCHACAC' | tr '>' '>\n'
echo '>ABCCHACAC' | tr '>' '\>\n'
echo '>ABCCHACAC' | tr '>' '\>\\n'
echo '>ABCCHACAC' | tr '>' '\>\\n'

但我得到与输出相同的输入字符串,而我想要的正确输出是:

>
ABCCHACAC

我正在使用这个脚本对许多文件执行相同的操作:

for f in *.txt
do
  tr ">" ">\n" < "$f" > $(basename "$f" .txt)_newline_added.txt
done

【问题讨论】:

    标签: bash shell unix sed tr


    【解决方案1】:

    tr 用于一对一的字符替换,而不是替换字符串。例如。如果您将abc 翻译为def,它会将所有a 替换为d,将所有b 替换为e,并将所有c 替换为f。当第二个字符串比第一个字符串长时,多余的字符将被忽略。所以tr '&gt;' '&gt;\n' 表示将&gt; 替换为&gt; 并忽略\n

    使用sed 执行字符串替换。

    sed 's/>/>\n/g' "$f" > "$(basename "$f" .txt)_newline_added.txt"
    

    【讨论】:

    • 很好的答案。正是我想要的。我只认为您在引号内的\n 之后的sed 表达式末尾错过了一个关键的第三个分隔符(即/)。因此,正确的表达式是:sed 's/&gt;/&gt;\n/'
    • @votresignu 对,我也忘记了 g 修饰符在每行进行多次替换。
    • 如果我每行只有一个 &gt; 字符,g 是否必不可少?
    • 否,但问题中没有任何内容表明对输入文件有此约束。
    【解决方案2】:

    除了 Barmar 的回答之外,如果您使用的是基于 BSD 的 *nix(例如 OS X),则您需要包含转义的文字换行符,或者除了 sed 之外还可能使用 tr

    转义的文字换行符:

    $ sed 's/^>/>\
    /' "$f"
    

    sed with tr:

    $ sed 's/^>/>▾/' "$f" | tr '▾' '\n'
    

    Insert newline (\n) using sed

    【讨论】:

      猜你喜欢
      • 2017-12-22
      • 2015-07-07
      • 1970-01-01
      • 2020-07-07
      • 2017-04-12
      • 2016-04-21
      • 2021-10-18
      • 2013-07-08
      • 2017-11-04
      相关资源
      最近更新 更多