【发布时间】:2014-08-12 20:43:44
【问题描述】:
我有包含一行注释的文件,其中包含指向其他注释的链接
>filename_without_extension:line_nr的形式:
m01.txt:
Line 1. >m02:2
Line 2. >m02:3
Line 3.
m02.txt:
Line 1.
Line 2. >m01:3
Line 3. >m01:1 >m01:3
我想为每个链接行添加类似 wiki 的自动“反向链接” 还没有。所以想要的输出应该是这样的:
m01.txt:
Line 1. >m02:2 >m02:3
Line 2. >m02:3
Line 3. >m02:3 >m02:2
m02.txt:
Line 1.
Line 2. >m01:3 >m01:1
Line 3. >m01:1 >m01:3 >m01:2
我想出了一些非常糟糕且对 sed 不起作用的东西。它应该遍历我的笔记目录中的所有文件:
link_regex=$(sed -e '/(\>m[0-9]+\:[0-9]+?)+?/p')
linenr_from_link_regex=$(sed -e '/\>m[0-9]+?\:/d')
fname_from_cur_link=$(sed -e '/\:[0-9]+?\b/d;/\.txt/a')
link_from_f=$(sed -e '/^/\>/g;/\.txt$/d;/\:=/a' < "$f")
new_link_to_cur_f=$(sed -i "${linenr_fom_cur_link}a\ ${link_from_f}" ${fname_from_cur_link})
function create-cross-references () {
while read line; do
echo "$link_regex" | \ # look up links
echo "$linenr_from_link_regex" # pipe to get line number from current link
echo "$fname_from_cur_link" # turn current link to new file name
echo "$link_from_f" # turn current file name name to new link
echo "$new_link_to_cur_f" # add new link to current fname
done
}
for f in *.txt; do
create-cross-references
done
我哪里错了?另外,什么是更合理的解决方案(最好仍然使用 sed),它可以避免遍历所有行(包括那些没有链接的行) 我的笔记文件夹每次?感谢您的帮助!
【问题讨论】:
-
你能发布想要的输出吗?我的意思是处理后的m01和m02。如果 m01 中的一个项目由 7 个文件链接,您将如何处理这种情况?你如何决定,应该“返回”到哪个文件?
-
我添加了输出。我猜这里的“反向链接”不太正确;它们是相互交叉的项目。如果文件 1 中的项目 1 具有指向文件 2 中项目 2 的链接,则文件 2 中的项目 2 也应该获得指向文件 1 中项目 1 的链接。如果项目有 7 个链接,它们只是被列出并在项目之后(行)一个接一个。感谢您的思考!
-
我认为您不能像在示例中那样将命令保存在变量中。
var=$(command)将command的输出保存到var。 -
@whereswalden 是的,我也不确定。它没有用,所以你可能是对的。 :)