如何跨多行包装嵌入在 bash/shell 脚本中的长 sed 命令?

ske*_*tax 2 bash sed line-breaks multiline

在我的 shell 脚本中,我将 for 循环的输出通过管道传输到带有长“s|||”的嵌入式 sed 命令中 替换语句,如下:

#/usr/bin/bash

output=/cygdrive/c/output.csv

for i in a b {d..z}
do
    find /cygdrive/$i -type f -name "*.ext" -printf "%p %k\n" |
    sed -e "s|^.\+/\([A-Z]\+\)/\(20..\)/\([0-9]\+\)-\([0-9]\+\)\.bfc\ \([0-9]\+\)|$i,\1,\2-\3-\4,\2,\3,\4,\5|"
done >> $output
Run Code Online (Sandbox Code Playgroud)

sed 命令太长,所以我的问题是如何将 sed 行包装在多行中并打破它?

例如:

#/usr/bin/bash

output=/cygdrive/c/output.csv

for i in a b {d..z}
do
    find /cygdrive/$i -type f -name "*.ext" -printf "%p %k\n" |
    sed -e 
    "s|^.\+/\([A-Z]\+\)/\(20..\)/\([0-9]\+\)-\([0-9]\+\)\.bfc\ \([0-9]\+\)
      |$i,\1,\2-\3-\4,\2,\3,\4,\5|"
done >> $output
Run Code Online (Sandbox Code Playgroud)

小智 5

你能把那个特定的字符串放在一个变量中,比如:

SED_PATTERN="s|^.\+/\([A-Z]\+\)/\(20..\)/\([0-9]\+\)-\([0-9]"
SED_PATTERN+="\+\)-\([0-9]\+\)\.bfc\ \([0-9]\+\)"
SED_PATTERN+="|$i,\1,\2-\3-\4,\2,\3,\4,\5|"

for i in a b {d..z}
do
    find /cygdrive/$i -type f -name "*.ext" -printf "%p %k\n" |
    sed -e "$SED_PATTERN"
done >> $output
Run Code Online (Sandbox Code Playgroud)

我认为这将是最干净的方式。