SED和整线

时间:2013-02-18 05:08:55

标签: shell sed

我正在尝试为我的包创建spec文件。 要列出我正在使用find命令并将其重定向到文件的文件:

readonly TOPDIR=`pwd` 
cd package_folder
find . -iname >>$TOPDIR/list_files

现在我的问题是我需要为每个目录添加前缀%dir,否则我会将文件列出两次错误。 假设我的文件内容是:

$ cat list_files
/bin
/bin/file_a
/bin/my_folder
/bin/my_folder/file_b

我所做的是寻找dir的

for file_name in `cat $TOPDIR/list_files`
do
  chk_1=`ls -l $file_name |grep "^d"`
  if [ "chk_1" ] ;then
   sed -i "s@^$file_name@%dir $file_name@" $TOPDIR/list_files
  fi
done

现在我的输出文件(list_files)如下所示:

%dir /bin
%dir /bin/file_a
%dir /bin/my_folder
%dir /bin/my_folder/file_b

原因/bin是一个目录,因此它将/bin替换为%dir。 嗯,这有点奇怪,因为我没有给出@g选项,但它仍在替换所有/bin。 有没有办法在"\n"中加入sed

2 个答案:

答案 0 :(得分:1)

你的脚本很容易出错。请改用:

while IFS= read -r file_name
do
   [ -d "$file_name" ] && pfx="%dir " || pfx=""
   printf "%s%s\n" "$pfx" "$file_name"
done < "$TOPDIR/list_files" > tmp &&
mv tmp "$TOPDIR/list_files"

它将保护您免受包含空格,制表符,@符号,反斜杠等等的文件名的影响,并且如果tmp文件的空间不足(在sed上创建sed文件),它将阻止您破坏原始文件飞)。

答案 1 :(得分:0)

使用您当前的技巧,确保模式与$的整行匹配,以标记该行的结尾:

sed -i "s@^$file_name\$@%dir $file_name@" $TOPDIR/list_files

需要使用反斜杠来防止shell展开$@; sed没有看到反斜杠。