使用 sed 替换第一个“;”一行有一个字符串,然后是第二个“;”用另一个字符串

使用 sed 替换第一个“;”一行有一个字符串,然后是第二个“;”用另一个字符串

我有一个以分号分隔的播放列表,格式如下:

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

相关内容