我想复制文本文件中的行,即时编辑它以将所有 / 替换为 |并粘贴到同一行的同一行中。
我在文本文件中有第一行:
http://webpage.com/(name-never-changes)/aCcboeasdfdRD/asdfasdft21.jpg
在 (name-never-changes) 和 .jpg 之间复制文本
/aCcboeasdfdRD/asdfasdft21
更改为/到|
|aCcboeasdfdRD|asdfasdft21
并在 URL 所在行的末尾添加分隔符,分隔符可以是文本、数字或特殊字符
http://webpage.com/(name-never-changes)/aCcboeasdfdRD/asdfasdft21.jpg (separator) |aCcboeasdfdRD|asdfasdft21
这应该适用于具有不同 URL 的多个文本文件
我无法创建新文件并合并它们,这应该是动态的,因为文本文件的名称不同并且我不知道文件名
答案1
尝试这个,
awk -F '[/.]' '{print $0" (separator) |"$(NF-2)"|"$(NF-1)}' file
http://webpage.com/(name-never-changes)/aCcboeasdfdRD/asdfasdft21.jpg (saperatot) |aCcboeasdfdRD|asdfasdft21
/.
两个字段分隔符$0
打印整行$(NF-2) $(NF-1)
倒数第三个和第二个字段
如果你想保存在文件中
选项1:(如果行数很少)
echo "`awk -F '[/.]' '{print $0" (separator) |"$(NF-2)"|"$(NF-1)}' file`" > file
选项2:(如果是大文件)
awk -F '[/.]' '{print $0" (separator) |"$(NF-2)"|"$(NF-1)}' file > tempFile ; mv tempFile file
对于文件夹中的多个文件:
cd /path/to/dir
for file in `ls`
do
echo "`awk -F '[/.]' '{print $0" (separator) |"$(NF-2)"|"$(NF-1)}' $file`" > $file
done
答案2
这是一个sed
解决方案:
sed 'h; s@^[^/]*//[^/]*/[^/]*/@ (separator) |@; s@/@|@g; s/\.jpg$//; x; G; s/\n//'
一步步:
h
将当前行从“模式空间”复制到“保留空间”。s@^[^/]*//[^/]*/[^/]*/@ (separator) |@
是一个s替代命令用作@
分隔符。它取代了东西//东西/东西/
(即) 与. 如果你愿意的话 你可以做 。http://example.com/(top-level-directory)/
(separator) |
s@^http//example.com/(top-level-directory)/@ (separator) |@
s@/@|@g
也是一个s替代命令用作@
分隔符。它将/
行中所有剩余的字符替换为|
字符。如果您确定只有一个(在(second-level-directory)
和(filename)
),您可以省略g
.s/\.jpg$//
显然.jpg
从行尾删除了扩展名。 (如果您不知道扩展名是什么,您可以执行类似的操作s/\.[^.]*$//
。)x
交换模式空间和保持空间,因此原始行现在回到模式空间中,并且(分隔器) |(二级目录)|(文件名)
我们刚刚建造的位于货舱内。G
Gets 保留空间的内容并将其附加到模式空间(在它们之间插入换行符)。s/\n//
删除该换行符。
这会将空行作为空行传递。其他线路将被破坏。
如果您想就地编辑文件,只需传递sed
选项-i
(或者-i.bak
,如果您的系统需要或需要)。