在 shell/bash 中的几个文件中将 '>' 替换为 '>\n'

Replace '>' with '>\n' in several files in shell/bash

我在一个文件夹中有几个文件,我想将所有这些文件中的字符 > 替换为 >\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

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

使用 sed 执行字符串替换。

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

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

转义文字换行符:

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

sed tr:

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