复制文本文件中的行并将修改后的行添加到同一文件中的行末尾

复制文本文件中的行并将修改后的行添加到同一文件中的行末尾

我想复制文本文件中的行,即时编辑它以将所有 / 替换为 |并粘贴到同一行的同一行中。

我在文本文件中有第一行:

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,如果您的系统需要或需要)。

相关内容