如何在unix中删除最后一个带斜杠的字符?

如何在unix中删除最后一个带斜杠的字符?

我有一个像这样的vlsi代码。

instance1/instance2/instance3/and_gate_inst/and_gate/a_pin
instance1/instance2/or_gate/b_pin

现在你能帮我得到如下所示的东西吗:

instance1/instance2/instance3/and_gate_inst/and_gate 
instance1/instance2/or_gate

抱歉造成混乱,以上是正确的问题......

答案1

您似乎想要获取包含其路径存储在这些行中的文件的目录的路径。

已经给出了涵盖基本情况的答案,但是我将提到在一般情况下值得考虑的几点:

  • 在大多数 Unices 上,文件路径可以由除 0 之外的任何字节序列组成。其中包括用于表示换行符的字节。这可以包括不形成有效字符的字节序列,该序列可以长于LINE_MAX(标准常量(但其值由每个实现自行决定),该常量定义文本行可能具有的最大字节数,如果您愿意的话)以保证文本实用程序能够在它们上正常工作)。

    因此,这里输入格式无法表示任何文件路径列表(例如包含换行符的文件路径列表),即使对于没有换行符且低于 LINE_MAX 字节的文件路径列表,您也需要在 C 语言环境中运行文本实用程序确保它们可以处理任意字节值。

  • /是路径组成部分分隔符,但是

    • /alone 比较特殊,代表根目录文件。没有目录包含该文件,尽管按照惯例我们通常说它的父目录是它本身。无论如何,如果它可能出现在输入中,您将需要对其进行特殊处理。
    • 多个/行为相似的序列,foo//bar与 相同foo/bar
    • 除了在开始时正好有两个 的序列//。其中///foo与 相同/foo,但//foo不保证与 相同/foo(在某些系统上并非如此)。更一般地说,对于以 . 开头的文件的一般情况,我们无法得知太多//。例如,每个/分隔组件甚至可能不是目录,所以在这种情况下,很难决定该怎么做。
  • foo也是相对路径。它的父目录.不是空字符串

  • .并且..是比实际文件更多的目录遍历工具。但他们参考到实际文件。那么,我们应该为它们的目录名或父目录报告什么(..../..分别?或者.像其他/-less相对路径一样?)。

  • foo/bar/或者foo/bar//至少foo/bar只要foo/bar它本身是一个目录,那么它的父目录应该是foo.

少一个驯服的输入可以是:

//foo/bar
///foo//bar//
foo
foo//
.
../
foo<0x80>bar/baz<0x81>
--foo
/
//
///

解决问题的一种方法是服从命令dirname,在没有明显的决定的情况下接受其决定。

可移植的困难部分是从基于行的输入获取参数dirname

在 GNU 系统上,可以通过以下方式完成:

xargs -rd '\n' -a your-file dirname --

GNU dirname8.30 给出:

//foo
///foo
.
.
.
.
foo<0x80>bar
.
/
/
/

但不适用于大多数其他系统,因为:

  • -d-r-a/或非标准 GNUxargs扩展
  • 一些xargs实现因非文本输入而卡住
  • dirname不需要接受多个参数(很少有人这样做)。

对于长于所执行命令的最大大小参数的文件路径,它仍然可能失败。

答案2

sed 's|/[^/]*$||'

在哪里

  • /匹配字面意思/
  • [^/]*匹配零个或多个非/字符
  • $匹配行尾

答案3

要获得所需的输出,awk您可以使用以下命令:

awk -F'/' '{print $1"/"$2}' <file_name>

-F'/'选项将“/”定义为列分隔符。 print $1"/"$2 打印第一列,连接“/”并打印第二列。

您还可以通过剪切实现所需的输出。

cut -d'/' -f1,2 <file_name>

答案4

谢谢大家,

终于这成功了。

awk -F "/" '{$NF=""; print $0}' instance1/instance2/instance3/and_gate_inst/and_gate/a_pin | sed 's/ /\//g' | sed 's/\/$//'
awk -F "/" '{$NF=""; print $0}' instance1/instance2/or_gate/b_pin | sed 's/ /\//g' | sed 's/\/$//'

相关内容