【问题标题】:Spread 'sed' command over multiple lines将“sed”命令分布在多行上
【发布时间】:2011-05-11 00:56:36
【问题描述】:

我正在尝试将一个 sed 命令分布在 bash 文件中的多行中。我有多个 sed 检查的模式,我希望通过换行来分离一些模式。这是我当前不起作用的脚本,将所有内容放在一行上可以,但我希望将其清理一下并将其拆分。

#!/bin/sh -f

#files=$(ls -1 | egrep '.avi|.mkv');

#echo $files
for f in *.mkv *.avi;
 do
  renF=`echo $f | tr '.' ' ' | sed -e 's/ \([^ ]*\)$/.\1/; s/\ \[sharethefiles\ com\]//i' \
  -e 's/\ x264\-Ctu//i; s/\ x264\-Bia//i; s/\ x264\-Fov//i' \
  -e 's/\ Xvid\-Lol//i; s/\ Xvid\-Xor//i; s/\ Xvid\-Notv//i; s/\ Xvid\-Fqm//i; s/\ Xvid\-p0w4//i; Xvid\-BIA//i; s/\ Xvid\-Chgrp//i; s/\ Xvid\-Fov//i' \
  -e 's/\ PDTV\-Fov//i; s/\ PDTV\-River//i; s/\ PDTV\-Sfm' \
  -e 's/\ Dts\-Chd//i; s/\ WEB\-DL//i; s/\ H264\-SURFER//i' \
  -e 's/\ Dsr//; s/\ WS//i; s/\ PDTV//i; s/\ X264//i; s/\ Blu\-Ray//; s/\ Bdrip//i; s/\ Bluray//i; s/\ HDTV//i; s/\ DTS//i; s/\ AC3//i; s/\ Dd5//i; s/\ Dualaudio//i; s/\ AAC2//i; s/\ XVID//i'`
  #echo $renF
  if [ "$f" == "$renF" ]; then
        echo "FileName already cleaned."
  else
        mv "$f" "$renF"
  fi
 done

感谢您的帮助!

【问题讨论】:

  • “不起作用”是什么意思?您收到错误消息吗?它是什么?输出是否与您的预期不同?以什么方式?不必按照您的方式转义空格和连字符。

标签: bash sed


【解决方案1】:

不确定我是否理解你,但如果你只想拥有多行 sed 表达式,你可以这样做:

v=`echo 123|sed 's/1/2/
s/2/3/
s/3/4/'`; echo $v

这将按预期显示423

如果你想要它在一行上,这也是可能的:

v=`echo 123|sed 's/1/2/ ; s/2/3/ ; s/3/4/'`; echo $v

给出相同的结果。

就我所见,我实际上建议像您已经在做的那样在多行中执行它,只需将每个 -e 放在单独的行上,因为我认为这样更具可读性。比如:

v=`echo 123|sed \
   -e 's/1/2/' \
   -e 's/2/3/' \
   -e 's/3/4/'`
echo $v

查看此链接了解更多信息:

Quoting multiple sed lines in the Bourne shell

【讨论】:

  • 好吧,我希望在一行中包含相同的命令,例如: sed -e 's/\ Xvid\-Lol//i; s/\Xvid\-Xor//i; s/\ Xvid\-Notv//i 并使用分号分隔相似的模式,而不是单独拆分每个模式。如果可以的话,尝试将这些模式配对。
【解决方案2】:

问题出在这一行:

-e 's/\ Xvid\-Lol//i; s/\ Xvid\-Xor//i; s/\ Xvid\-Notv//i; s/\ Xvid\-Fqm//i; s/\ Xvid\-p0w4//i; Xvid\-BIA//i; s/\ Xvid\-Chgrp//i; s/\ Xvid\-Fov//i' \

缺少s/。应该是:

-e 's/\ Xvid\-Lol//i; s/\ Xvid\-Xor//i; s/\ Xvid\-Notv//i; s/\ Xvid\-Fqm//i; s/\ Xvid\-p0w4//i; s/\ Xvid\-BIA//i; s/\ Xvid\-Chgrp//i; s/\ Xvid\-Fov//i' \

为了保持一致,我包含了反斜杠。

这一行不见了//i:

-e 's/\ PDTV\-Fov//i; s/\ PDTV\-River//i; s/\ PDTV\-Sfm

更正:

-e 's/\ PDTV\-Fov//i; s/\ PDTV\-River//i; s/\ PDTV\-Sfm//i

我收到的错误消息是导致我找到错误根源的原因:

sed: -e expression #3, char 93: unknown command: `X'

sed: -e expression #4, char 51: unterminated `s' command

以下是关于如何使其更具可读性和可维护性的建议:

while read -r pattern
do
    sedscript+="$pattern;"
done <<EOF
s/ \([^ ]*\)$/.\1/
s/\ \[sharethefiles\ com\]//i
s/\ x264\-Ctu//i
s/\ x264\-Bia//i
...
s/\ XVID//i
EOF

renF=$(echo "$f" | tr '.' ' ' | sed -e "$sedscript")

【讨论】:

  • 嗯,也许纠正那些愚蠢的错误可能是问题所在。我得去看看。
  • 感谢您的帮助,我很感激,这就是我想要的。谢谢!
【解决方案3】:

如果 GNU sed 可用(未内置在 OSX 中),可能更好的选择是使用heredoc:

sed -f - "$IN" > "$OUT" << SED_SCRIPT
  s/a/1/g
  s/test/full/g
SED_SCRIPT

来源:https://unix.stackexchange.com/questions/45591/using-a-here-doc-for-sed-and-a-file

【讨论】:

    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2018-03-25
    • 2012-09-22
    • 1970-01-01
    相关资源
    最近更新 更多