我有一个以分号分隔的播放列表,格式如下:
Thåström ; Stjärna som är din ; Skebokvarnsv. 209
我想;
用破折号 (-) 替换第一个,;
用字符串“- Album: ”替换第二个
我正在尝试以下构造,但它不正确:
sed 's/\;/\-/1;s/\;/\-\ Album\:/2'
布尔结果是:
Thåström - Stjärna som är din ; Skebokvarnsv. 209
我知道错误的部分在第一段,因为如果我只运行,sed 's/\;/\-\ "Album\:"/2'
我会在行尾得到正确的结果:
Thåström ; Stjärna som är din - Album: Skebokvarnsv. 209
任何帮助深表感谢!
答案1
我在 MacOS 13.5.2 中的普通“sed”上运行它
我认为你已经非常接近拥有你想要的了。我采用的构造仅使用命令行上指定的两个表达式。-f <command_file>
如果您愿意,您也可以将它们放入文件中并使用该选项
sed -e 's/;/-/' -e 's/;/- Album:/'
第一个表达式将用该行的第一个分号进行替换。第二个表达式改变下一个。由于它们是按顺序处理的,因此我不必像示例那样担心在末尾指定数字标志。
使用额外的空行来分隔输出的示例。
echo 'Thåström ; Stjärna som är din ; Skebokvarnsv. 209' \
| sed -e 's/;/-/' -e 's/;/- Album:/'
Thåström - Stjärna som är din - Album: Skebokvarnsv. 209
预计到达时间:在您的原始示例中,第二个表达式有 a2
作为标志。这将取代第二个;
。但是,您的第一个替换替换了第一个;
,因此您的命令正在尝试替换第三 ;
在线上。如果你只是放弃它,2
它应该按你的预期工作。
答案2
使用gawk
:
$ awk '{ sub(/;/,"-"); sub(/;/, "- Album:")}1' file
$ awk '{ print gensub(/(^[^;]*);([^;]*);(.*)/, "\\1-\\2- Album:\\3", g);}' file
要将相同的模式多次替换为不同的字符串,则可以使用以下方法。
$ awk 'BEGIN{ar[1]="-"; ar[2]="- Album:";}{r=$0; for(i=1;i<=length(ar);i++) r=gensub(/;/, ar[i], 1, r); print r}' file
答案3
使用乐(以前称为 Perl_6)
~$ raku -ne 'S/ \; /-/ andthen S/ \; /- Album:/.put;' file
Raku 是 Perl 编程语言家族中的一种编程语言。上面您使用了-ne
逐行非自动打印命令行标志,并且只需执行两次连续S///
替换,然后执行 out put
。该put
调用会在行尾添加换行符。
输入示例:
Thåström ; Stjärna som är din ; Skebokvarnsv. 209
示例输出:
Thåström - Stjärna som är din - Album: Skebokvarnsv. 209
这非常好Raku 的一个方面是它支持 Unicode。因此,您可以使用 Unicode 特征来过滤和/或替换您的文本:
~$ raku -ne 'S/ \; /-/ andthen S/ \; /- Album:/ andthen S/ <:Script<Runic>>+ /⁒/.put;'
输入示例:
16F1 ᛱ Thåström ; Stjärna som är din ; Skebokvarnsv. 209
16F2 ᛲ Thåström ; Stjärna som är din ; Skebokvarnsv. 209
16F3 ᛳ Thåström ; Stjärna som är din ; Skebokvarnsv. 209
示例输出:
16F1 ⁒ Thåström - Stjärna som är din - Album: Skebokvarnsv. 209
16F2 ⁒ Thåström - Stjärna som är din - Album: Skebokvarnsv. 209
16F3 ⁒ Thåström - Stjärna som är din - Album: Skebokvarnsv. 209
上面,三个 Runic 字母被插入到示例输入中。 Raku 正则表达式可以根据字符识别和/或过滤掉字符Unicode 脚本指定(在本例中<:Script<Runic>>
)。尽管 StackOverflow 似乎无法显示它们,但符文字母已正确替换为 Unicode ⁒
“商业减号”( U+2052 )。
https://www.unicode.org/charts/PDF/U16A0.pdf
https://docs.raku.org/language/regexes
https://raku.org
答案4
使用任何 sed:
$ sed 's/;\([^;]*\);/-\1- Album:/' file
Thåström - Stjärna som är din - Album: Skebokvarnsv. 209