在我的 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
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
最佳答案
你能把那个特定的字符串放在一个变量中吗:
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
我认为这是最干净的方式。
关于bash - 如何将嵌入在 bash/shell 脚本中的长 sed 命令跨多行包装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63312103/