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

GB *_*ran -2 sed awk text-processing

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

instance1/instance2/instance3/and_gate_inst/and_gate/a_pin
instance1/instance2/or_gate/b_pin
Run Code Online (Sandbox Code Playgroud)

现在你能帮我得到如下内容吗?

instance1/instance2/instance3/and_gate_inst/and_gate 
instance1/instance2/or_gate
Run Code Online (Sandbox Code Playgroud)

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

Sté*_*las 6

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

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

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

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

  • / 是路径组件分隔符,但是

    • /单独是特殊的,代表根目录文件。没有包含该文件的目录,尽管按照惯例我们通常说它的父目录是它本身。在任何情况下,如果它可能出现在输入中,您必须特别对待它。
    • 多于一个的序列/就像一个一样,foo//bar是一样的foo/bar
    • 除了在刚开始的两个//. Where///foo与 相同/foo,但//foo不保证与 相同/foo(在某些系统上并非如此)。更一般地说,对于以//. 例如,每个/分隔的组件甚至可能不是目录,因此在这种情况下,很难决定要做什么。
  • foo也是相对路径。它的父目录.不是空字符串

  • .并且..是比实际文件更多的目录遍历工具。但它们指的是实际文件。那么,我们应该怎样汇报他们的目录名称或父目录(..../..分别吗?还是.像其他/稀少相对路径?)。

  • foo/bar/或者foo/bar//是AME的foo/bar至少只要foo/bar本身是一个目录,所以它的父目录应该是foo

不太驯服的输入可能是:

//foo/bar
///foo//bar//
foo
foo//
.
../
foo<0x80>bar/baz<0x81>
--foo
/
//
///
Run Code Online (Sandbox Code Playgroud)

解决问题的一种方法是服从dirname命令,当没有一个明显的决定时,接受它的决定。

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

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

xargs -rd '\n' -a your-file dirname --
Run Code Online (Sandbox Code Playgroud)

GNU dirname8.30 给出了:

//foo
///foo
.
.
.
.
foo<0x80>bar
.
/
/
/
Run Code Online (Sandbox Code Playgroud)

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

  • -d,-r和/-a或非标准的 GNUxargs扩展
  • 几个xargs实现阻塞了非文本输入
  • dirname 不需要接受一个以上的参数(很少有)。

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


Kam*_*ski 5

sed 's|/[^/]*$||'
Run Code Online (Sandbox Code Playgroud)

在哪里

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