我正在尝试构建一个脚本,其中一部分使用'sed'将文件名标记到该文件中每行的末尾,然后将输出转储到主列表.脚本给我带来麻烦的部分在这里:
DIR=/var/www/flatuser
FILES=$DIR/*
for f in $FILES
do
echo "processing $f file...."
sed -i "s/$/:$f/" $f
cat $f >> $DIR/master.txt
done
Run Code Online (Sandbox Code Playgroud)
问题是'sed'语句在for循环之外工作正常,但是当我把它放在脚本中时,我相信它有解释美元符号的问题.我已经尝试过几乎每一个"和"的组合,我能想到它来解释变量,并且它不断地在每行的末尾加上"$ f",或者它完全失败.
感谢您的任何意见!
你只需要逃脱美元符号:
sed -i "s/\$/:$f/" "$f"
Run Code Online (Sandbox Code Playgroud)
所以shell将字面意思传递给了sed.
扩展Charles Duffy关于引用变量的观点:
DIR=/var/www/flatuser
for f in "$DIR"/*
do
echo "processing $f file...."
sed -i "s/\$/:${f##*/}/" "$f"
cat "$f" >> "$DIR/master.txt"
done
Run Code Online (Sandbox Code Playgroud)
如果任何文件名包含空格,那么如果您将文件名列表分配给它,则为时已晚$FILES.您不能再区分属于文件名的空格和分隔文件名的空格.您可以使用数组,但将glob直接放入for循环更简单.以下是使用数组的方法:
DIR=/var/www/flatuser
FILES=( "$DIR"/* )
for f in "${FILES[@]}"
do
echo "processing $f file...."
sed -i "s/\$/:${f##*/}/" "$f"
cat "$f" >> "$DIR/master.txt"
done
Run Code Online (Sandbox Code Playgroud)
对于sed不使用的版本-i,这里有一种显式处理模拟就地编辑所需的临时文件的方法:
t=$(mktmp sXXXX); sed "s/\$/:$f/" "$f" > "$t"; mv "$t" "$f" && rm "$t"
Run Code Online (Sandbox Code Playgroud)