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

标签 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

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/

相关文章:

bash - 重命名多个目录,同时保留中间部分具有不同的后缀

linux - unix shell 脚本中的段错误(核心转储)错误。帮忙找bug?

regex - sed 需要正则表达式

Vim:禁用特定行的自动换行

linux - 从文件中删除匹配词

regex - 使用 sed 添加空格

linux - 如何在 Linux 上使用 sed 从文件名中获取值?

java - 在根节点之前的xml文件中添加换行符

c++ - 如何使用libcurl发布数据(包括换行符)(适用于Influxdb)?

bash - FASTA文件的序列长度