使用sed命令将文件名附加到每个文件的每一行

3
我有多个文件,它们的名称如下 --> 100.txt、101.txt、102.txt等。
这些文件位于一个目录中。对于每个文件,我需要将文件名中扩展名前面的数字添加到文件中的每一行。
因此,如果100.txt文件的内容如下:
blahblahblah
blahblahblah
...

我需要输出为:
blahblahblah 100 
blahblahblah 100
...

我需要使用sed来完成这个任务。
我的当前代码看起来很丑,也不够简洁:
dir=$1
for file in $dir/*
do
    base=$(basename $file)
    filename="${base%.*}" 
    sed "s/$/ $filename/" $file
done

这样做可能吗?
find $dir/* -exec sed ... {} \; 

“最好还要与 find 一起使用”。你想用 find 的特别原因是什么? - Ignacio Vazquez-Abrams
我进行了编辑。如果有更简洁的方法,不一定要用find,但我确实需要sed。 - buydadip
2个回答

3
您已经拥有的代码本质上是在bash中执行任务的最简单、最短的方式。我会做的唯一更改是传递-ised,假设您使用的是GNU sed(否则您将需要将输出重定向到临时文件,删除旧文件,并将新文件移到其位置),并提供一个默认值以防$1为空。
dir="${1:-.}"

1
在循环之前添加 cd $dir,并使用更简单的 * glob 替换 basename 调用。 - Etan Reisner

0

以下命令行将查找所有文件,其文件名为仅由数字和扩展名组成,并将文件名(数字)附加到该文件中每行的末尾..(我已经测试了几个文件)

find <directory path> -type f -name '[0-9]*' -exec bash -c 'num=`basename "{}"|sed "s/^\([0-9]\{1,\}\)\..*/\1/"`;sed -i.bak "s/.$/& $num/" "{}"' \;

注意:在 OS X 中未测试使用 sed 的命令行。
<directory path> 替换为您的目录路径。

不确定为什么会被踩,这个代码运行得很好,但在OS X上有一个问题,它会为目录中的每个文件创建名为file.txt.bak的文件。 - buydadip
是的,如果您不想备份文件而是在命令行中使用“sed -i.bak”,请改用“sed -i”。 - repzero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接